簡體   English   中英

如何在C ++中將稀疏數組有效地保存在文件中?

[英]How can I efficiently save a sparse array in a file in C++ ?

我有一個具有6個索引的雙精度數組,並且大多數都是零。 我還不知道應該使用哪種類型將其存儲在內存中。

但是,最重要的是:我想將其保存到文件(二進制文件?)中。 最有效的保存方法是什么? 一項要求是,我可以遍歷所有非零條目而不必傳遞零。 如果我跑了6個巢穴for將需要太多生命。

此外,我不知道如何實際保存它:是否需要兩個文件,一個用作索引,第二個包含所有值?

謝謝!

這可能是一個已解決的問題; 可能還有稀疏矩陣庫也可以為您提供有效的內存表示形式。 (例如,每一行都是index:value的列表,存儲在std::vector ,鏈接列表,哈希或其他數據結構中,具體取決於在中間插入單個非零值是否有價值或其他重要操作) )。


二進制格式將可以更快地存儲/加載,但是對於表示稀疏數組的某些方式來說,使用二進制還是文本並不重要。 如果以二進制格式編寫,則與字節序無關的代碼是確保其可移植性並且沒有僅在某些體系結構上顯示的錯誤的好方法。

選項:

  • 簡單但有點丑陋:gzip / lz4 / lzma存放多維數組的緩沖區,將結果寫入磁盤。 在保存/加載時即時轉換為little-endian,或以格式存儲endianness標志。

  • 相同的想法,但存儲每個值的所有6個索引。 如果許多最里面的數組都沒有非零值,那就很好了。 每個非零值都有一個單獨的記錄(行,基於文本的格式)。 樣例行(為便於閱讀,使用三重嵌套示例,將其擴展到6就可以了):

dimensions on the first line or something
a b c  val
...
3 2 5   -3.1416

表示: matrix[3][2][5] = -3.1416

  • 使用嵌套的稀疏數組表示:每行都是index:value的列表。 不存在的索引為零。 文本格式可以使用空格和換行符分隔事物; 二進制格式可以在每行的開頭使用一個長度字段,或者在結尾使用一個哨兵值。

    您可以將多維數組展平為一個線性索引,以使用32位整數索引進行存儲,也可以以某種方式表示嵌套。 我不會嘗試為此編寫一種文本格式,因為在我開始考慮它時,它變得很難看。

6維數組的常規平面表示形式...

double [10] [10] [10] [10] [10] [10] = 1百萬個條目* 8字節〜= 8MB

關聯數組Index:Value表示形式,假設50%的條目為0.0 ...使用4字節的32位索引...

500,000 * 4字節+ 500,000 *字節〜= 6MB

稀疏數組的位圖表示,假設50%的條目為0.0 ...設置了位,以便每個字節表示數組10000001b中的8個條目將意味着8個條目,其中僅表示第一個和最后一個,並表示6個中間值被忽略,因為它們為零...

ceil(1百萬/ 8)字節+ 500,000 * 8字節〜= 4.125MB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM