c++ - 在 C++ 中读取/写入大文件的性能问题

标签 c++ linux qt sockets io

我正在通过 Qt 开发一个应用程序。

在这个应用程序中,主线程是一个网络服务器。另一个线程有时会从大文件 (250mb) 中读取数据并将它们写入输出文件 (~2gb)。

该线程对文件进行高I/O操作,CPU iowait在70%左右。

我的问题是写入文件时,网络服务器没有快速响应。我的理解是服务器的 qt 套接字(在 Linux 上)由连接到轮询或选择事件系统的系统套接字表示。所以 Qt 仅在轮询发出事件时才向我的应用程序发送信号。

我的想法是,写入文件的大量 io 操作可能会阻塞轮询系统,因此我的 qt 服务器不会接收到套接字事件。当线程完成数据写入后,一切正常。

文件的写法是这样的:

while(dataToRead){
    // context has the list of files to read and current step
    dataToRead = extractData(context, &pBuffer, &sizeBuf);

    fwrite (pBuffer, 1, sizeBuf, pOutFile);

    free(pBuffer);
    pBuffer = NULL;

    // usleep(100000);
}

如果我添加一个 break with usleep 函数,这有助于避免问题,但如果我没有使用足够大的 sleep ,则不能完全避免。但是太大的 sleep 会破坏性能,我是尽可能快地生成文件。

我做错了什么?尽可能快地读/写文件是否安全?在上述功能中是否必须 sleep ?但是我们怎么知道好的时间片呢?

我正在研究 Mint LMDE、Linux 3.2.0 64 位、Intel Core i5 2500 和标准 HDD 驱动器。

编辑: 此处提供了重现该问题的示例程序:https://bugreports.qt-project.org/secure/attachment/30436/TestQtBlocked.zip .需要qt的qmake来编译。如果你运行它,它会创建一个空的 3GB 文件,工作线程将在启动时启动并在几秒钟内创建文件。在此期间,如果您尝试连接到 http://localhost:8081/并多次运行 F5 刷新页面,您会发现有时它没有快速响应。 如果有人可以用我的示例程序重现我的问题并告诉我,这可能会有所帮助。

最佳答案

如果您正在等待主线程的选择调用,请创建一个单独的线程来执行文件 I/O。当事件来自 Qt 时,触发某种 IPC 唤醒您的工作线程以执行大文件 I/O 并立即从您的事件处理程序返回。

(假设异步写入文件对您的程序逻辑有意义。只有您自己才能弄清楚这是不是真的。)

关于c++ - 在 C++ 中读取/写入大文件的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13846033/

相关文章:

c++ - 为什么新编译的 g++ 说 "ld: cannot find -lg++"

c++ - Qt拖放按钮;下降未检测

c++ - 类 - 用户定义的具有动态大小的智能阵列

c++ - 加载和使用 HLSL 着色器?

c++ - 如何从 C++ 中的外部函数调用 delete 运算符?

html - 在 HTML 文件中查找特定标签

php - 从 PHP 脚本获取 Windows 和 Linux 上的主目录的最佳形式是什么?

C++ weak_ptr.lock() 段错误

qt - Q_PROPERTY 未显示

c++ - 如何将 XMMATRIX 和 XMVECTOR (DirectX11) 相乘?