2012-03-06 73 views
4

我需要處理3D立方體數據。其元素數量可能達數十億。我知道我無法在Windows上分配太多內存。所以我正在考慮使用進程內數據庫進行基於磁盤的操作。有沒有更好的方法來做到這一點?也許有什麼提升?如何在C++中處理大小爲1,000,000,000的數組?

更新:我最終必須提供繪圖瀏覽功能。

更新2:下面的文章似乎是使用內存映射文件的一個很好的解決方案。我會嘗試它並再次更新。 http://www.codeproject.com/Articles/26275/Using-memory-mapped-files-to-conserve-physical-mem

+1

好吧,Win7的臨高達192GB,這是以上幾種支持大型陣列相當有用,我認爲:) – 2012-03-06 17:11:50

+6

請解釋你正在試圖處理你的數據。有了這麼多的元素,你真的想仔細考慮你正在努力完成什麼。您將運行的算法將確定適當的數據結構。例如,我想你可能實際上是在談論一個1000x1000x1000立方體,也許大部分元素都是空的。也許你想要一棵八叉樹。但也許需要完全不同的東西。我們需要更多信息。 – 2012-03-06 17:12:32

+0

@AlanBaljeu我希望你的猜測是對的。但立方體是另一個密集維度的圖像。所以我需要這麼大的尺寸,所有的元素都同樣重要。 – 2012-03-06 17:16:08

回答

4

您能否更有效地存儲數據(請閱讀Bentley的「Programming Pearls」),是否稀疏數據?

如果不是,內存映射文件(MMF)是你的朋友,並允許你映射MMF塊到內存中,你可以像其他任何內存一樣訪問內存。

使用CreateFileMappingMapViewOfFile將塊映射到您的過程中。

+0

感謝您的回答。不,它根本不稀疏。它是另一個密集維度的圖像。你能給我一些關於如何處理MMF的參考嗎?我真的希望有一個簡單的庫,所以我可以像數組一樣使用它。 – 2012-03-06 17:12:38

+0

@david:編輯我的答案。 – 0xC0000022L 2012-03-06 17:18:29

+0

我沒有直接使用你的答案,但我找到了一個使用內存映射文件的解決方案。謝謝你給我指導。 – 2012-03-06 19:30:29

5

第一步也是最基本的一步就是將數據分解成塊。塊的大小取決於您的需求:它可以是一次可以繪製的最小或最大的塊,也可以是可以構建幾何的幾何塊,也可以是壓縮的最佳大小。

一旦處理了可管理的塊,立即回憶內存問題就會消失。根據需要流式傳輸塊(加載和卸載/保存)。

在加載/保存過程中,您可能希望涉及壓縮和/或各種數據庫。即使像RLE和SQLite這樣簡單的東西(包含座標和數據blob的單表)也可以節省很多空間。更好的壓縮將允許您使用更大的塊大小。

根據使用情況,可能會將塊壓縮在內存中,並且只能在修改時進行簡單解壓縮(或者可以對其進行修改時)。如果您的數據是隻讀的,加載它們並僅在需要時解壓縮將非常有用。

將數據拆分成塊也具有副作用,例如對於八叉樹而言是一種非常簡單的形式,允許在獨立的數據塊上運行幾何體生成(行進多維數據集等)(並簡化線程),並進行保存/加載過程顯着簡單。

+0

同樣,我的數據是另一個密集維度的圖像。我不知道如何將數據分成塊。是的,我也在想SQLite。不過,我真的希望有更好的API。感謝您的回答。 – 2012-03-06 17:23:50

+0

如果你的數據是圖像,那麼自然的假設是將圖像分割。這將在切片環境中起作用。如果數據依賴於其3D鄰居,則稍微複雜一些。如果您可以在問題中更詳細地描述數據,或者更好地給出一個小樣本,那將會很有幫助。 – ssube 2012-03-06 17:27:15

+0

是的,數據依賴於它的3D鄰居。這是高光譜圖像。所以我不能通過圖像真正分割 – 2012-03-06 17:34:08