什么花费更少的时间:读取多个文件或将内容合并到一个大文件中?

mik*_*mik 2 c++ csv file

我需要打开和操作许多文件中存在的数据,这些文件位于多个文件夹中.我们说的是大约500k文件,其中包含大约5Gb的数字数据.

我使用过这些数据,但运行半简单算法大约需要一个小时.我想知道更改文件地址的过程是否是最耗时的操作...(因为我必须做循环,我连接我想要访问的文件夹/文件号码).我正在将所有原始数据合并到一个文件(带有文件ID)中,希望通过所有原始数据花费更少的时间...

我在这个假设中是否正确?这需要我很多时间.我用c ++做这个.感谢您的任何意见

@Thomas:谢谢你的建议.我正在添加多个缓冲区,它已经显示出有希望的迹象.我肯定会为每个任务启动线程.我将尝试使我的阵列大约1 Mb,看看它是否真的加快了速度.所有缓冲区都是全局变量,所以它应该没问题......

Tho*_*ews 5

通常,读取文件是性能的主要瓶颈之一.那么,让我们从那里开始吧.

优化文件阅读

优化输入文件读取的最佳方法是减少输入请求的数量并扩展每个请求的数据量.因此,不是一次读取一个值,而是使用一个读取语句读取一个值块.

块读取
我建议将大块(1Mb)中的数据读入内存,然后从缓冲区中提取数据.当数据跨越缓冲区末尾到新缓冲区时,您需要考虑这种情况.

内存映射文件
某些操作系统具有将文件视为内存中字节数组的功能.操作系统为您处理将数据加载到内存中的过程.这不是标准的C++,取决于操作系统.

多个线程,一个用于读取
另一个解决方案是使用多个线程,至少两个.其中一个线程的任务是将数据读入缓冲区并通知另一个线程数据已准备就绪.操作系统可以将读取线程委托给另一个核心,允许另一个核心执行计算.

双重和多重缓冲
扩展多个线程,使用多个数据缓冲区."读取"线程将读入一个缓冲区,而另一个线程从不同的缓冲区中提取数据.我们的想法是使用尽可能多的缓冲来减少计算线程的等待量.

更改数据格式 固定长度记录比可变长度记录更快读取.因此,如果数据只是数字,请使用固定宽度字段.

如果多次读取数据,请考虑读取文件一次并编写二进制(原始,非文本)格式的新文件.从此文件中读取第二次和更多次迭代,从而无需将文本格式转换为内部格式.