【发布时间】:2016-10-13 00:00:16
【问题描述】:
我正在尝试使用标准输入一次一行地读取 100gb 文件
Port = open_port({fd, 0, 1}, [in, binary, {line, 4096}]),
但这会使我的系统充满消息,直到我用完 ram。有没有办法让它像 {active, once} 与端口?还有 io:get_line() 但我想知道这是否可行。
【问题讨论】:
我正在尝试使用标准输入一次一行地读取 100gb 文件
Port = open_port({fd, 0, 1}, [in, binary, {line, 4096}]),
但这会使我的系统充满消息,直到我用完 ram。有没有办法让它像 {active, once} 与端口?还有 io:get_line() 但我想知道这是否可行。
【问题讨论】:
不,对端口没有流量控制,因此如果处理速度不够快,则应使用另一种处理方法。您可以使用
在STDIN 上设置二进制模式
ok = io:setopts(standard_io, [binary]),
如果您使用的是版本 17 或更高版本(存在影响性能的错误),则可以使用 file:read_line(standard_io) 阅读它。
【讨论】:
readahead是否可以设置为standard_io。您可以使用变通方法检查是否存在行尾并连接未完成的行。它将在内存中执行复制,但我不知道任何其他解决方案。