c++ - 读入一个文件并将其分成 100 个较小的文件非常慢

标签 c++ c file file-io

所以我正在读取相对较大的文件(> = 1GB),其中包含数百万条记录,每个记录都属于一个特定组。有 100 个组。为了更有效地处理数据,我创建了 100 个文件,每组 1 个。 (在追加模式下使用 fopen。)当我从大文件中读取记录时,我将每一条记录写入相应的较小文件中。我始终保留所有打开文件的文件指针,这样我就不会打开和关闭每条记录的文件。

这需要非常长的时间,并且读入(和写入)的速度不是恒定的。它开始时很快,然后会慢得像爬行一样,然后再次加速,然后缓慢。读取的文件越多,情况似乎会变得更糟。

发生的情况的一种可能性是,随着它们变大,较小的文件需要在存储中重新定位。这令人惊讶,因为我有 47GB 可用空间(约 500GB)。但我想不出其他什么了。我会看看重新碎片是否有帮助,但与此同时,有人知道发生了什么事以及如何解决这个问题吗?有没有办法预先指定要创建的文件的大小,类似于 std::vector::reserve

最佳答案

您只会看到文件系统缓存填满容量的副作用,然后必须等到数据实际写入磁盘而释放空间。这是极其缓慢的。当缓存中有空间时, write() 调用会执行内存到内存的复制,以每秒 5 GB 或更高的速度运行。磁盘写入速度很少超过 30 兆字节/秒。巨大的差异,并且您正在测量缓存已满时的磁盘写入速度。

您需要更多的 RAM 或更快的磁盘。

关于c++ - 读入一个文件并将其分成 100 个较小的文件非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13876045/

相关文章:

c - 在c中读取unicode文件

asp.net-mvc - 从asp.net mvc Controller 返回一个js文件

php - 将新值附加到 formData 对象时遇到问题

c++ - 错误: No Match for `Operator<<` [closed]

c++ - Boost IOStream 创建 zip 文件的示例?

c++ - 我的项目中指向 int 的速度问题

c - 使用 opencv 在相机上线程化face_detection

c - 无论输入什么数值,输出均为 0.00 浮点值

c++ - 作用于可 move 但不可复制对象序列的变异 STL 算法的行为

c - 如何通过libxml2获取包含 "&"的正确属性