大多数以内存有效的方式在C ++中转置大文件

时间:2017-03-07 15:19:29

标签: c++ memory memory-management

我有一个输入文件,它是40,000列,200万行。这个文件内存大约为70GB,因此可以一次性放入内存中。

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

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

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

我觉得必须采用更节省内存的方法来实现这一目标。有人认为我使用的是mmap,它可以让我在不将文件读入内存的情况下进行转置。还有其他选择吗?

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

由于

2 个答案:

答案 0 :(得分:1)

我可能会对文件进行预处理传递,只需要在其工作集中一次只有一行。

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

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

答案 1 :(得分:0)

我认为你这样做的最好方法是解析每一行并找出它是否是垃圾。在此之后,您可以将剩余的行放入输出中。这可能需要更长的时间,但它可以节省大量内存,并且可以避免使用对于您尝试打​​印的任何文本完全无用的行。但是,使用mmap也是实现目标的好方法

希望这会有所帮助!!