选择性 stream.read() 与一个长 stream.read()

Selective stream.read()s vs one long stream.read()

提问人:Cooper Maira 提问时间:11/18/2023 更新时间:11/18/2023 访问量:36

问:

我正在从我注册然后放置的数千个单独的帧中构建一个合成图像。单个帧约为 6400x4800 像素,但最终仅为最终合成图像贡献约 200x500 像素。我通过构建合成图像的 voronoi 图/zbuffer,然后将区域映射回贡献帧,提前确定各个帧的哪些部分将进入合成图像。在我需要从磁盘加载图像数据之前,我会这样做。这就产生了一种情况,即我想从磁盘中读取一小块不连续的内存。怎么做?

做这样的事情会更快吗:

stream.open(image_file_path, std::ios::binary);
stream.read(raw_buffer, width*height);
stream.close();

或者这样做是否值得:

for(unsigned int i = 0; i < region.height; i++){
   stream.seekg(read_location); 
   stream.read(&raw_buffer[i * region.width], region.width);
   read_location += width;
}
stream.close();
C++ 图像

评论

0赞 user207421 11/18/2023
最好不要读取不需要的数据。你的第一个可能会也可能不会更快 不,但第二个会使用更少的内存。
0赞 Botje 11/18/2023
或者,内存映射文件(您将主要进行随机访问)并复制您需要的区域?编码速度会快得多。madvise
0赞 Thomas Matthews 11/18/2023
恕我直言,更好的方法是使用缓冲或多缓冲和至少两个线程。一个线程开始读取缓冲区。当缓冲区已满时,将读入下一个缓冲区,读取器线程通知主线程缓冲区已准备好进行处理。请记住,从文件中读取比从内存中读取要慢得多。此外,您可以实现的最佳效率是保持流的流动。
0赞 Paul Sanders 11/18/2023
我不确定你到底有没有问题。对于现代硬件来说,您正在读取的数据量很小,尤其是在您有 SSD 的情况下。

答: 暂无答案