繁体   English   中英

在C ++中转储大文件的最有效内存方式

[英]Most memory efficient way to transpose a large file in C++

我有一个输入文件,它是40,000列乘200万行。 此文件的内存大小约为70GB,因此可以一次容纳到足够大的内存。

我需要有效地转置此文件,但是有些行是垃圾行,不应添加到输出中。

我目前的实现方式是使用ifstream和嵌套的get行,该行有效地将整个文件读入内存(从而让OS处理内存管理),然后像这样输出转置。 这可以在可接受的时间范围内工作,但是显然为应用程序占用了很大的内存。

现在,我必须在群集上运行该程序,这使我需要提前指定内存需求,因此,较大的内存占用量会增加群集中的作业排队时间。

我觉得必须有一种内存效率更高的方法来执行此操作。 我曾经想过要使用mmap,这将使我可以进行转置而完全不将文件读入内存。 还有其他选择吗?

明确地说,我很乐意使用可以在合理的时间内完成此操作的任何语言和方法(我的当前程序在本地工作站上的这个大文件上花费大约4分钟)。

谢谢

我可能会通过对该文件进行预处理传递来做到这一点,该传递仅需要在其工作集中一次有一行。

过滤垃圾并使每一行具有相同(二进制)大小。

现在,您可以对临时文件进行内存映射,并将列作为输出的行。

我认为,执行此操作的最佳方法是改为解析每一行,并找出其是否为垃圾内容。 之后,您可以将剩余的行输入到输出中。 这可能会花费更多时间,但会节省大量内存,并使您不必花太多时间处理行,而这些行对您要打印的任何文本完全没有用。 但是,使用mmap也是实现目标的好方法

希望这可以帮助!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM