在c++中将一个巨大的文本文件(2Gb以上)分成2个块
Splitting a huge text file (2Gb+) into 2 chunks in C++
我有一个巨大的文本文件,有两列(浮动)。我想把它们分成两个文件,每个文件包含大约相同数量的行。最好的方法是什么?我正在使用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"命令。
相关文章:
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 使用 TinyXML2 更改多个 XMLElement 文本
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 我如何使用上一个块的哈希链接2个块
- C ,在多个块中捕获用户定义的异常
- 为什么我可以构造具有多个字符串文本的字符串?
- 如果我使用共享内存,可以分配多少个块
- GNURADIO:让流标记通过多个块
- 如何在 EOF (C++) 之前读取多个块中的文件
- 使用OpenSSL/C++和PHP/Mcrypt进行AES-128-CBC加密:仅对第一个块进行解密
- Windows 通用应用 (XAML):不能使用给定的参数列表调用文本块>文本
- C++比较两个字符串文本
- 在 c++ 中,在 char 数组的第一个块处创建位图
- 我需要将一个大文件分成多个块.由于我的文件大小更大(50GB),我需要分成更大的块
- 如何比较两个不同文本文件中的两个不同字符串
- 在c++中将一个巨大的文本文件(2Gb以上)分成2个块
- C++比较两个不同文本文件之间的单词
- 使用unordered_map删除两个大型文本文件中的重复项
- 连接两个字符串文本
- 我应该在一个读写或多个块通过套接字发送文件