我想处理一个太大而无法读入内存的二进制文件。目前我使用ByteString.Lazy.readFile流式传输字节。我认为使用 streaming 是个好主意包以使我的程序更快。但是,documentation对于 readFile
说:
readFile :: FilePath -> (Stream (Of String) IO () -> IO a) -> IO a
Read the lines of a file, using a function of the type: 'Stream (Of String) IO () -> IO a' to turn the stream into a value of type 'IO a'.
所以
streaming
包只读取 ASCII 文本文件?我可以使用这个包将二进制文件读取为字节吗?
最佳答案
为了详细说明@Cubic 的评论,虽然人们普遍认为应该在生产代码中避免惰性 I/O 并用流式方法代替,但这是 不是 直接关系到性能。如果您正在编写一个程序来一次性处理一个大文件,只要您现在有一个运行良好的惰性 I/O 版本,那么可能没有好的性能理由将其转换为流式包。
事实上,流式传输更有可能增加一些开销,因此我怀疑在大多数情况下,一个优化良好的惰性 I/O 解决方案会胜过一个优化良好的流式传输解决方案。
避免延迟 I/O 的主要原因是 previously discussed on SO .简而言之,惰性 I/O 使得难以一致地管理资源(例如,文件句柄和网络套接字),使得难以推理空间使用情况(例如,一个小的程序更改可能导致您的内存使用量爆炸式增长),并且如果有问题的 I/O 的时间和顺序很重要(如果您只是读入一组文件和/或写出另一组文件,通常不是问题),则有时是“不安全的”。
用于读取和/或写入大文件的短期实用程序可能是采用惰性 I/O 风格编写的不错选择。只要它们在运行时没有任何明显的空间泄漏,它们可能就可以了。
关于haskell - 在 Haskell 中读取大型二进制文件的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55804770/