在c++中将一个巨大的文本文件(2Gb以上)分成2个块

Splitting a huge text file (2Gb+) into 2 chunks in C++

本文关键字:2个块 文本 文件 2Gb 以上 分成 一个 c++ 巨大      更新时间:2023-10-16

我有一个巨大的文本文件,有两列(浮动)。我想把它们分成两个文件,每个文件包含大约相同数量的行。最好的方法是什么?我正在使用VS 2012。文件大小约为2Gb

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

[这里是在c++中完成的:相关问题:](在c++中分割一个大文件)

代码真的需要你来"启动"。无论如何,这里是我的一些想法——我也从其他评论者那里借用了一些。

我的方法,伪代码:

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上进行适当的截断。这可能会导致我的方法中大约一半的IO写操作,并且由于它处理的是普通字节拷贝,因此避免了在中点行开始之后逐行处理。

只要行具有均匀的长度分布,这种方法将导致在两个输出文件中出现大约相同数量的行;另一方面,即使行长度以歪斜的方式相差很大,两个输出文件的大小也将大致相同。

使用Unix中的"split"命令。