我想处理一个太大而无法读入内存的二进制文件。目前,我使用ByteString.Lazy.readFile来流传输字节。我认为使用流媒体包来提高程序速度是一个好主意。但是,的文档显示readFile:
readFile :: FilePath -> (Stream (Of String) IO () -> IO a) -> IO a使用类型为'Stream(Of String)IO()-> IO a'的函数读取文件的行,以将流转换为'IO a'类型的值。
所以streaming包只读取ASCII文本文件?我可以使用该程序包以字节为单位读取二进制文件吗?
为了详细说明 @Cubic 的评论,虽然人们普遍认为在生产代码中应该避免惰性 I/O 并用流方法代替,但这与性能没有直接关系。如果您正在编写一个程序来对大文件进行一些一次性处理,只要您现在有一个运行良好的惰性 I/O 版本,就可能没有良好的性能理由将其转换为流包。
事实上,流式传输更有可能增加一些开销,因此我怀疑在大多数情况下,优化良好的惰性 I/O 解决方案的性能会优于优化良好的流式传输解决方案。
避免 Lazy I/O 的主要原因之前已在 SO 上讨论过。简而言之,惰性 I/O 使得难以一致地管理资源(例如,文件句柄和网络套接字),难以推断空间使用情况(例如,一个小的程序更改可能会导致内存使用量激增),并且如果相关 I/O 的时间和顺序很重要(如果您只是读入一组文件和/或写出另一组文件,通常不是问题),那么有时会“不安全”。
用于读取和/或写入大文件的短时间运行的实用程序可能是采用惰性 I/O 风格编写的良好候选者。只要它们在运行时没有任何明显的空间泄漏,就可能没问题。