我希望如果有人能提供完整的工作代码,使得在Haskell中可以执行以下操作:
从二进制文件中读取一个非常大的序列(超过10亿个元素)的32位int值到适当的容器中(例如肯定不是列表,因为存在性能问题),并且如果每个数小于1000(十进制),则将其加倍,然后将结果的32位int值写入另一个二进制文件。我可能不想一次在内存中读取整个二进制文件的所有内容。我想在上一个块之后读取一个块。
我感到困惑,因为我几乎找不到关于这个的文档。Data.Binary,ByteString,Word8等等,这只会增加混淆。在C / C ++中,这样的问题有相当简单的解决方案。取一个所需大小的数组(例如unsigned int),使用read / write库调用即可完成。在Haskell中,对我来说似乎不那么容易。
如果您的解决方案使用最佳的标准包,并且可与主流Haskell(> GHC 7.10)一起使用,而不是某些模糊/过时的包,则我将不胜感激。
我从这些页面中阅读
从二进制文件中读取一个非常大的序列(超过10亿个元素)的32位int值到适当的容器中(例如肯定不是列表,因为存在性能问题),并且如果每个数小于1000(十进制),则将其加倍,然后将结果的32位int值写入另一个二进制文件。我可能不想一次在内存中读取整个二进制文件的所有内容。我想在上一个块之后读取一个块。
我感到困惑,因为我几乎找不到关于这个的文档。Data.Binary,ByteString,Word8等等,这只会增加混淆。在C / C ++中,这样的问题有相当简单的解决方案。取一个所需大小的数组(例如unsigned int),使用read / write库调用即可完成。在Haskell中,对我来说似乎不那么容易。
如果您的解决方案使用最佳的标准包,并且可与主流Haskell(> GHC 7.10)一起使用,而不是某些模糊/过时的包,则我将不胜感激。
我从这些页面中阅读
Data.Word
。如果停止使用replicateM
,也可以删除Control.Monad
。你可以使用已经导入的System.IO
中的hIsEOF
来检查 EOF,只需一个函数调用即可。哦,而且我毫不知情,你是从哪里得到System.IO
不可靠的印象的?也许说这话的人是在谈论该模块中的特定功能? - MathematicalOrchidreplicateM 1000
的意思是“读取1000个块”。而chunk_size
是一个块中有多少字节。这些数字并不特别,我只是选择了一些示例值。实际上,你可能不会真的读取1000个块,你会编写一个循环来检查EOF或其他情况。 - MathematicalOrchid