我想将大型记录(> 10,000,000个元素)数组保存到磁盘,以便稍后将数组重新加载到内存中。我用下面简单的函数从Visual F#2010技术计算:如何将大型F#数组记录保存到文件?
let save filename x =
use stream = new FileStream(filename, FileMode.Create)
BinaryFormatter().Serialize(stream, x)
type Test = { a : int; b : int}
let x = [| for i in 1..6 do
let a=i
let b=i*i
yield {a=a;b=b}|]
save "file.dat" x
当我做到这一点(与真实数据),我得到的错误:
System.Runtime.Serialization.SerializationException: The internal array cannot expand to greater than Int32.MaxValue elements.
现在,我的解决办法是转换为Deedle,然后保存为csv,但我认为保存/重新加载的计算更有效,不需要从csv重建数组。
let x2 = x |> Frame.ofRecords
x2.SaveCsv("file.csv")
我要么自己生成CSV,要么尝试使用FsPicker:http://nessos.github.io/FsPickler/ –
'Int32.MaxValue'是'2,147,483,647',这个数量级比' 10,000,000',所以我想知道这里真的出了什么问题...... –
@MarkSeemann也许我说的大小错了 - 我是以x.Length为基础的。记录的类型是'type rp = {a:int; b:int; c:LocalDate; d:LocalDate; c:float; d:float}'是否重要?数组是'val rp:rp []'。我认为这些关于记录类型的细节是无关紧要的。 – nh2