File io 将open(Filename,{delayed_write,Size,Delay})与索引相结合

File io 将open(Filename,{delayed_write,Size,Delay})与索引相结合,file-io,erlang,File Io,Erlang,我如何将一个open(Filename,{delayed_write,Size,Delay})与一个关于将数据写入何处的索引结合起来 我想等到收到一定数量的数据,然后将其写入文件中的某个位置 {read_-ahead,Size}是否与{delayed_-write,Size,Delay}相反?我想读一定量的数据发送它 谢谢提前阅读是延迟写作的反面,因为阅读是写作的反面 如果您想读取和发送更大的内存块,您不需要提前读取,只需读取大内存块并发送它们(这里不需要保存太多操作系统调用) 从前面阅读的手册

我如何将一个open(Filename,{delayed_write,Size,Delay})与一个关于将数据写入何处的索引结合起来

我想等到收到一定数量的数据,然后将其写入文件中的某个位置

{read_-ahead,Size}是否与{delayed_-write,Size,Delay}相反?我想读一定量的数据发送它


谢谢

提前阅读是延迟写作的反面,因为阅读是写作的反面

如果您想读取和发送更大的内存块,您不需要提前读取,只需读取大内存块并发送它们(这里不需要保存太多操作系统调用)

从前面阅读的手册页:

如果read/2调用的大小不明显小于或甚至大于Size 字节,则无法预期性能增益

打开时不需要指定和索引。仅使用和或和的组合

但是,在文件的不同位置写入可能会降低延迟写入的增益,因为(也包括手册页):

缓冲的 数据也会在其他文件之前刷新 执行写入/2以外的操作


如果您有多个位置的数据块,请将它们收集在
{Location,Bytes}
列表中,并随时一次性写入。这可以映射到非常高效的
writev(2)
系统调用,一次写入多个块。

所以我只需将整个列表传递给它,它就会写入,还是我必须迭代列表来写入每个元素?此外,我是否需要运行一个进程并等待接收这些数据,然后使用列表数据循环?如果需要,在我写入磁盘后,列表是如何清空的?谢谢您将列表传递给pwrite/2,它会自己写入所有内容,并且性能良好。要写入的块确实会由接收循环收集。但在详细讨论之前,让我先问另一个问题:您确定写入磁盘时存在性能瓶颈吗?你能再详细说明一下你想做什么(例如数据的平均块大小、数据到达的速度等)吗?你知道优化的两个规则吗?谢谢你迄今为止的帮助。我将下载和上传,它将使用bittorrent协议。我不知道这两条规则。在测量之前不要进行优化。2.规则1很重要!!!如果您选择pwrite/2路线,etorrent可能会为此使用补丁。我只是用一个换位/写组合键。