haskell - 在 Haskell 中读取大型二进制文件的最快方法是什么?

标签 haskell

我想处理一个太大而无法读入内存的二进制文件。目前我使用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/

相关文章:

haskell - 如何在 Haskell 中将 "unpack"列表作为单个参数?

haskell - 如何找到列表中最长的单词?

haskell - 新型 HashMap 键的 FromJSON 实例

haskell - 为什么在 Haskell 中没有推断出多态值?

haskell - 如何通过命令行使用 hoogle 搜索所有包?

haskell - 如何在启动时使用 'stack ghci' 导入而不是加载模块?

haskell - 使用通用元组函数一次多次折叠

haskell - 在 readFile 后使用行

list - 如何将一个列表压缩到另一个嵌套在 Haskell 中的列表上?

haskell - ST 周围的 newtype 导致类型错误