Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将一个巨大的文本文件(2Gb+;)在C++;_C++_File Io - Fatal编程技术网

C++ 将一个巨大的文本文件(2Gb+;)在C++;

C++ 将一个巨大的文本文件(2Gb+;)在C++;,c++,file-io,C++,File Io,我有一个巨大的文本文件,有两列(浮动)。我想把它们分成两个文件,每个文件包含大致相同的行数。最好的方法是什么?我正在使用VS2012。文件大小约为2Gb。有一个免费工具,名为Windows文件拆分器 它可以分割任何类型和大小的文件。 或 您还可以在windows上的cygwin中使用grep,也可以在powershell中使用grep [这里是用C++完成的:相关问题:] ()在Unix中使用“split”命令。如果您在Windows上,请使用Cygwin。代码确实需要由您“启动”。无论如何,这

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

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

[这里是用C++完成的:相关问题:]
()

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

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

我的方法,伪代码:

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写入,并且由于它处理纯字节拷贝,因此可以避免在找到中点行的起始位置后逐行处理

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


现在开始编码。

“包含两列的文本文件”,“将它们拆分为两个文件,每个文件包含的列数大致相同”。那么1呢?我很确定他指的是相同数量的行,我指的是行。谢谢编辑。pst:这需要多长时间?这些文件很大,我没有SSD。你是说每个文件都包含大致相同的行数吗?如果行长度大致不变,你可以将文件长度除以2,跳到那里,找到下一个换行符并从那里剪切。是的。那个轮子是很久以前发明的。