gpt4 book ai didi

c++ - 在C/C++中快速读取多个文件的某些字节

转载 作者:可可西里 更新时间:2023-11-01 18:37:21 25 4
gpt4 key购买 nike

我一直在网上搜索这个问题,虽然有很多关于 C/C++ 读/写的类似问题,但我还没有找到关于这个特定任务的信息。

我希望能够读取多个文件(256x256 文件)sizeof(double) 字节 位于特定位置每个文件。现在我的解决方案是,对于每个文件:

  1. 打开文件(读取,二进制模式):

    fstream fTest("current_file", ios_base::out | ios_base::binary);

  2. 求我想读的位置:

    fTest.seekg(position*sizeof(test_value), ios_base::beg);

  3. 读取字节:

    fTest.read((char *) &(output[i][j]), sizeof(test_value));

  4. 并关闭文件:

    fTest.close();

这需要大约 350 毫秒for{ for {} } 结构中运行,迭代次数为 256x256(每个文件一次)。


问:您认为有更好的方法来实现这个操作吗?你会怎么做?

最佳答案

如果可能,我建议重新组织数据。例如,将所有这些 double 放在一个文件中,而不是将它们分布在多个文件中。

如果您需要多次运行程序并且数据不变,您可能需要创建一个工具来首先优化数据。

文件的性能问题是开销:

  1. {overhead}增加硬盘驱动器。
  2. {overhead}定位文件。
  3. 在文件中定位。
  4. 读取数据。
  5. {关闭一个文件对性能。

在大多数使用大量数据的基于文件的系统中,读取数据被优化为具有比任何开销更长的持续时间。这些请求将被缓存和排序以实现最佳磁盘访问。不幸的是,在您的情况下,您没有读取足够的数据,因此开销现在比读取的持续时间更长。

我建议尝试对数据的读取操作进行排队。采用 4 个线程,每个线程打开一个文件并读取 double ,然后将它们放入缓冲区。这里的想法是错开操作。

  • 线程 1 打开一个文件。
  • 线程 2 打开一个文件,而线程 1是定位。
  • 线程 3 打开一个文件,而线程 2是定位和线程1是读取数据。
  • 线程 4 打开一个文件,线程 3位置,线程 2 读取,线程 1关闭。

希望这些线程可以让硬盘驱动器保持足够的忙碌,不会减慢速度;连续事件。您可能可以先在单个线程中尝试此操作。如果您需要更好的性能,您可能需要考虑将命令直接发送到磁盘驱动器(先命令它们)。

关于c++ - 在C/C++中快速读取多个文件的某些字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2874570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com