如何将大文件读入字符串

时间:2017-05-31 18:02:59

标签: ruby serialization io

我尝试在执行程序期间保存并加载矩阵状态(使用Matrix),其中dumpload来自Marshal }。我可以序列化矩阵并得到一个~275 KB的文件,但是当我尝试将其作为字符串加载回来将其反序列化为一个对象时,Ruby只给我一个开头。

# when I want to save
mat_dump = Marshal.dump(@mat)  # serialize object - OK
File.open('mat_save', 'w') {|f| f.write(mat_dump)}  # write String to file - OK

# somewhere else in the code
mat_dump = File.read('mat_save')  # read String from file - only reads like 5%
@mat = Marshal.load(mat_dump)  # deserialize object - "ArgumentError: marshal data too short"

我尝试更改load的参数,但没有找到任何不会导致错误的内容。

如何将整个文件加载到内存中?如果我可以通过块读取文件块,然后循环将其存储在String中然后反序列化,它也会工作。该文件基本上有一个大行,所以我甚至不能说我会逐行读取它,问题保持不变。

我看到了一些关于这个主题的问题:

但他们似乎都找不到我想要的答案。

1 个答案:

答案 0 :(得分:1)

Marshal是二进制格式,因此您需要以二进制模式进行读写。最简单的方法是使用IO.binread/write

...
IO.binwrite('mat_save', mat_dump)
...
mat_dump = IO.binread('mat_save')
@mat = Marshal.load(mat_dump)

请记住,Marshaling依赖于Ruby版本。它与其他Ruby版本只有compatible under specific circumstances。所以记住这一点:

  

在正常使用中,编组只能加载使用相同主版本号和相同或更低版本号编写的数据。