2011-06-12 34 views
2

我有一個很大的數據集,我從中得到一組層級集合摘要,在不同的粗糙級別。我想將這些摘要緩存在磁盤上的一個文件中,每個摘要都可以通過它的偏移從文件中檢索。最初的總結是通過從初始數據集中取出小塊(大約256字節)並從每個塊中提取最大值而得到的。然後通過取前述總結中每對值的最大值來推導出後續的總結。下面的(初步)說明會希望澄清:將大型數據集摘要寫入磁盤

251 18 5 91 11 17 54 16 9 31 201 148 173 214 66 43 ;;Initial data-set (chunked) 

    251   54   201   214  ;;Summary 0 

      251      214    ;;Summary 1 

         251       ;;Summary 2 

我試圖實現是導出(然後緩存)這些總結其擴展到大型數據集的手段,例如4GB的順序。速度並不是一個特別的問題,但空間是:因爲對於那些規模的數據集,即使總結可能太大而無法在內存中處理。我一直在嘗試許多方法:

  1. 簡易方法是簡單地寫出來完全每層然後讀回在計算下一層。這顯然是最簡單的方式,但它看起來並不是最優雅或高效的。內存映射可能會提供一些改進,但這也可能意味着我需要事先預先分配文件。

  2. 計算塊中的每一層 - 計算第一層的塊,然後是第二層,然後是第三層,依此類推,最後將塊寫入文件以適當的偏移量重新啓動過程。與此相關的問題是,由於每個塊都是塊的一半大小,所以在計算完所有層之前,我們會得到0塊大小。

  3. 對每個摘要使用單個文件。

  4. 使用某種基於樹的方法(上圖 - 如果打開它的頭 - 類似堆)。也許樹中的每個節點可能代表每層中的1024個字節塊。父節點將有兩個孩子代表前一層中的連續塊,並且其內容將從這些孩子計算。一旦完成,子節點可以簡單地刷新到磁盤。我懷疑這個過程完全可以在內存中完成(儘管我不知道它的複雜性可能是什麼)。

想法/意見最受歡迎。

克里斯托弗

回答

1

好了,多一點研究,我最終與B樹去,在主內存中緩存的前幾名的水平之後。現在工作。

Chris