Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++ 什么会花费更少的时间:读取多个文件或将内容合并到一个大文件中?_C++_File_Csv - Fatal编程技术网

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

C++ 什么会花费更少的时间:读取多个文件或将内容合并到一个大文件中?,c++,file,csv,C++,File,Csv,我需要打开和操作存在于多个文件夹中的许多文件中的数据。我们说的是大约500k文件,其中包含5Gb左右的数字数据 我用过这些数据,但运行半简单的算法大约需要一个小时。 我想知道更改文件地址的过程是否是最耗时的操作。。。(因为我必须在连接要访问的文件夹/文件编号的地方执行循环)。 我正在将所有原始数据合并到一个文件(带有文件ID)中,希望它花费更少的时间来查看所有原始数据 我的假设正确吗?做这件事要花我很多时间。 我用C++做这个。 谢谢你的意见 @托马斯:谢谢你的建议。我正在添加多个缓冲区,它已经

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

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

我的假设正确吗?做这件事要花我很多时间。 我用C++做这个。 谢谢你的意见

@托马斯:谢谢你的建议。我正在添加多个缓冲区,它已经显示出有希望的迹象。我肯定会为每个任务启动线程。
我将尝试使我的阵列大小在1MB左右,看看它是否真的加快了速度。所有的缓冲区都是全局变量,所以应该可以…

我不认为你的问题有一个简单而快速的答案。如果您试图访问整个销售过程中的数据(即,您没有挑选和选择特定的数据块/文件),我认为如果您将所有数据放在一个位置,速度会更快

如果每次运行算法时,您只需要特定的信息,而文件只允许您访问这些信息,那么我将坚持您当前的结构


另一件要考虑的事情是你多久运行一次这个过程?您是否使用相同的信息运行?如果你做的是一次性的分析,我会建议你离开它,即使它确实需要更多的时间。如果这是一个您将定期运行的例程,并且您想再次对所有信息执行此操作,那么将您的数据分组到一个大集合可能是值得的。一般来说,读入文件是性能的主要瓶颈之一。那么,让我们从这里开始

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

块读取
我建议将大数据块(1Mb)读入内存,然后从缓冲区中提取数据。当数据跨越缓冲器的末端到新的缓冲器时,需要考虑这种情况。 内存映射文件
某些操作系统具有将文件视为内存中字节数组的功能。操作系统为您处理将数据加载到内存中的过程。这不是标准C++,取决于OS。p> 多个线程,一个用于读取
另一个解决方案是使用多个线程,至少两个。其中一个线程的任务是将数据读入缓冲区,并通知另一个线程数据已就绪。操作系统可以将读取线程委托给另一个内核,允许另一个内核执行计算

双重和多重缓冲
在多线程上展开,使用多个数据缓冲区。“读取”线程将读取一个缓冲区,而另一个线程从另一个缓冲区提取数据。其思想是使用尽可能多的缓冲来减少计算线程的等待量

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


如果多次读取数据,请考虑读取文件一次,并编写二进制(原始、非文本)格式的新文件。从该文件中读取第二次或更多次迭代,这样就不需要将文本格式转换为内部格式

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

谢谢您的回复。我肯定会对这些数据进行更深入的分析。我最大的担心是让电脑继续运行,结果是程序运行快了5分钟。尽管从数据缓冲区解析数字比从文件中涌入的数据快得多(正如你所说,瓶颈是读取速度)。固定长度条目有一个不同的优点:您可以计算文件中特定数据的偏移量。固定长度条目中的数字可以更容易地读入缓冲区,而不会出现从一个缓冲区到另一个缓冲区的数据交叉问题。:-)瓶颈不是带宽(“读取速度”)。瓶颈首先是查找/访问时间,以及遍历目录层次结构和打开/关闭文件。低端旋转磁盘驱动器的带宽高达100 MB/s,SSD的带宽高达500 MB/s。打开500k文件需要时间。此外,读取少量非块大小的数据会浪费带宽和缓冲区空间。硬件一次只能读取和传输一个完整的数据块,因此,如果您有大量的小文件,则不可避免地会加载大量您不打算使用的数据。关于大量的小文件对查找时间不利的观点是好的@ThomasMatthews现在将硬盘的500MB/s与缓存的50GB/s进行比较:您可以对数据执行100次操作