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

时间:2015-01-29 15:58:08

标签: c++ file csv

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

优化文件读取

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

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

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

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

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

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

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

答案 1 :(得分:1)

我不认为你的问题有一个快速而快速的答案。如果您尝试访问整个销售数据(即您没有选择并选择特定的数据/文件块),我会认为如果您将一个位置的所有数据都更快。

如果您每次运行算法时只需要特定信息,而文件只允许您访问该信息,我会坚持您目前的结构。

要考虑的另一件事是你经常运行这个过程吗?你在运行相同的信息吗?如果您正在进行一次性分析,我建议您离开它,即使它确实需要更多时间。如果这是您定期运行的例行程序,并且您希望再次对所有信息执行此操作,则可能需要将数据分组到一个大集合中

答案 2 :(得分:1)

每个文件访问都有开销。在能够访问之前,系统需要查找其物理位置。 如果你避免这种查找,那么你的剃须会有一点点开销。 如果您可以按照需要的顺序将数据放在文件中,您肯定会看到更大的加速,特别是如果使用传统的硬盘驱动器。如果您正在使用SSD并且具有大量用于缓存的RAM,则改进不会那么显着。 如果您可以访问大块数据,您将看到好处。如果您的计算需要随机访问您的数据,那么最好不要增加RAM用于磁盘缓存或购买SSD。