我正在尝试使用Visual Studio 2019实现对大型文件的快速处理。应读取、处理数据,然后将其写入同一文件的末尾。在做了一些测试后,我发现在我的硬件上,1MB的文件缓冲区似乎是最好的选择。
在这里,我尝试将其设置为1MB:
#include <fstream>
#include <array>
#include <memory>
using namespace std;
int main()
{
const streamsize BUFFER_SIZE = 1 * 1024 * 1024;
unique_ptr<::array<char, BUFFER_SIZE>> buffer = make_unique<::array<char, BUFFER_SIZE>>();
const streamsize FILE_BUFFER_SIZE = 1 * 1024 * 1024;
unique_ptr<::array<char, FILE_BUFFER_SIZE>> file_buffer = make_unique<array<char, FILE_BUFFER_SIZE>>();
ios::sync_with_stdio(false);
fstream stream;
stream.rdbuf()->pubsetbuf(file_buffer->data(), file_buffer->size());
stream.open(R"(C:\test\test_file.bin)", ios::in | ios::out | ios::binary);
while (stream.good())
{
stream.read(buffer->data(), buffer->size());
// Some data processing and writes here
}
}
在使用Sysinternals的ProcessMonitor监视程序时,我可以看到WriteFile函数实际上是使用1MB缓冲区调用的,但ReadFile函数在一个循环迭代中被调用了256次,只有4K缓冲区。这会导致更差的性能。
我在谷歌上搜索了这个问题,没有发现类似的案例。如果能帮上忙我将不胜感激。
联系客服