【问题标题】:Erlang consumer queueErlang 消费者队列
【发布时间】:2015-07-15 02:14:37
【问题描述】:

我有一个问题,我想将离散的数据块从磁盘提取到 queue 中,然后将它们 dequeue 到另一个进程中。此数据随机位于磁盘上,因此不会从顺序读取中受益。数据量很大,不能一次全部加载,一次拉一个块也效率不高。

我希望消费者能够以自己的速度运行,但要为其准备好健康的数据队列,这样我在处理块时就不会一直等待磁盘读取。

是否有既定的方法来做到这一点?即使用工作框架或安全阀?实现这一点感觉就像重新发明轮子一样,因为在磁盘数据上操作缓慢的消费者是一个常见问题。

关于如何以 Erlang 方式最好地解决这个问题有什么建议吗?

【问题讨论】:

    标签: io erlang queue throughput


    【解决方案1】:

    您可以在file:open/2 上使用{read_ahead, Bytes} 选项:

    {read_ahead, Size}

    此选项激活读取数据缓冲。如果read/2 调用的时间明显少于Size 字节,则仍对Size 字节块执行对操作系统的读取操作。额外的数据被缓冲并在随后的read/2 调用中返回,由于减少了操作系统调用的数量,因此提高了性能。

    read_line/1 函数在raw 模式下也高度使用read_ahead 缓冲区,为什么在使用该函数访问原始文件时建议使用此选项(出于性能原因)。

    如果read/2 调用的大小不明显小于或什至大于Size 字节,则无法预期性能提升。

    您对提到的使用的大小一直含糊不清,但似乎玩弄该缓冲区大小应该是实现您所需要的一个不错的开始。

    【讨论】:

    • 预读将在每次读取时加载更多数据,以便后续读取具有更好的吞吐量,但读取不是连续的。我正在读取分散在底层文件中的数据。所以这有时可能会有所帮助,但是将入站数据缓冲到一个按顺序使用的队列中会更好。我在想一个填满某个阈值然后由消费者按照自己的节奏排空的作业队列是最有意义的,但作业似乎并不特别适合这个用例。
    • 我会用该信息更新原始问题。
    • 我已经进行了编辑。我将实施 read_ahead 只是为了测试我对性能的假设,感谢您的建议。
    猜你喜欢
    • 2014-06-27
    • 2012-01-28
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多