简单快速的读取过程

Posted

技术标签:

【中文标题】简单快速的读取过程【英文标题】:Simple Fast read-process 【发布时间】:2019-03-25 14:00:38 【问题描述】:

我想从非常慢的设备(读取速度=1Mo/s)上的文件中解压缩数据。解压算法至少可以达到这个速度的三倍。 在 C/C++ 中并行化这些任务的最快方法是什么,这样读取过程不会因解压而减慢,从而使用最大带宽。

我已经用普通管道尝试了两个线程。但我不知道这是否是最好的解决方案。至少它不是零拷贝算法。 我当前的算法是错误的,因为我无法成功在管道上执行阻塞 IO。 (试过 fcntl 或 fread/fdopen)

我的无与伦比的程序非常简单。类似的东西

while(remainingToRead > 0)
    int nb = fread(buffer, 1, bufferSize);
    decompress(buffer, nb, bufferOut);
    nb -= remainingToRead

【问题讨论】:

我不明白这个问题。如果程序是 IO 绑定的,多线程不会让它更快。 @NathanOliver 这是我的第一反应,但实际上这个问题有点道理。也就是说,在读取一个块之后,可以在读取下一个块的同时进行解压,因此解压根本不需要时间。 @NathanOliver,据我所知,这个想法是在解压缩时执行阅读 @Jabberwocky 啊,是的。这样你就只有一次解压的时间,再加上文件读取时间。 @NathanOliver 理解我的问题。这个想法是读取过程不要等待数据被解压缩并且可以以“最大”速度读取。 【参考方案1】:

这里的一个解决方案是使用单独的线程来读取和解压缩并使用两个缓冲区,以便这些操作可以重叠。

伪代码:

阅读线程:

while (not finished)

    while (no buffers free)
        wait on condition variable
    fill next buffer
    mark buffer in use
    set condition variable for decompression thread

解压线程:

while (not finished)

    while (no buffers full)
        wait on condition variable
    decompress next buffer
    mark buffer free
    set condition variable for read thread

请注意,要使其正常工作涉及正确处理大量细节 - 多线程编程总是很棘手。

【讨论】:

假设解压后的数据必须存储在某个地方,可能在同一个慢速设备上,那么应该使用尽可能大的缓冲区。例如,对于慢速磁盘驱动器,这会优化(慢速)磁头移动。 在这种情况下,您对线程同步有何建议?互斥体? @SVA522 你的程序将在什么平台上运行? 这是一个旧的 MIPS 嵌入式 linux。数据在 µSD 上读取,总线速度很慢。 你有 std::condition_variable 和 std::atomic 吗?

以上是关于简单快速的读取过程的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程从 sql server 快速读取百万条记录,并使用 java 和 spring boot 将其写入 csv

linux 中开机启动过程简单

系统简单启动过程

性能测试:Jmeter压测过程中的短信验证码读取

性能测试:Jmeter压测过程中的短信验证码读取

java 做进度条 ajax实现 js jquery ext 都可以需要具体实现过程和代码 需要读取数据