在C ++中将一个巨大的文本文件(2Gb +)拆分为2个块

时间:2013-03-20 23:23:34

标签: c++ file-io

我有一个巨大的文本文件,其中包含两列(浮点数)。我想将它们分成两个文件,每个文件包含大致相同的行数。做这个的最好方式是什么?我使用的是VS 2012.文件大小约为2Gb。

3 个答案:

答案 0 :(得分:1)

有一个名为HJSplit的免费工具,Windows文件分割器 它可以分割任何类型和大小的文件。 或this。 你也可以在windows上的cygwin中使用grep,或者在powershell中使用grep

[这里用C ++完成:相关问题:] (Split a Large File In C++

答案 1 :(得分:1)

代码确实需要由您“启动”。无论如何,这里是我的一些想法 - 我也是从其他评论者那里借来的。

我的方法,伪代码:

open I for reading
open O1 for writing
open O2 for writing
while I has input:
   write next line from I into O1
   if I has input:
       write next line from I into O2

请注意,与Perl方法不同,它不需要先读取文件,直到读取行数。这将读取IO减少了大约一半。但是,与perl方法一样,它仍然可以逐行工作,并且需要行扫描/处理。由于此算法是流式传输(该行只能保持足够长的时间来写入),因此它应该适用于所有文件大小。缓冲输出流对性能非常关键。

Markus Mikkolainen建议的方法类似于:

open I for reading
seek to midpoint of I using filesize/2
scan backward to line start
open O1 for writing
write bytes 0..(mid line start + length) from I to O1
open O2 for writing
write bytes (mid line start + length)..filesize from I to O2

如果可以修改输入文件,那么只需要对O2进行写操作,然后在I上进行适当的 truncate 。这可能会导致我的方法的大约一半的IO写入,因为它处理一个普通的字节副本,所以避免在找到中点线的开始后逐行处理。

只要线条具有统一的长度分布,这种方法将导致两个输出文件中出现大致相同数量的线条;另一方面,即使线条长度以偏斜方式大相径庭,两个输出文件的大小也大致相同。

现在开始编码。

答案 2 :(得分:0)

在Unix中使用“split”命令。 Cygwin,如果你在Windows上。