我想將大型記錄(> 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