2010-08-22 62 views
0

我有一個C#程序,它使用生成語法生成樹木,花朵和類似有機實體的3D模型(有關L-Systems的更多信息,請參閱wikipedia entry) - 當我生成一棵帶葉子的大樹,我(預計)會在字符串中呈現指數級增長,如果我願意的話,它可以達到100的演出。處理超大字符串的選項

約束條件 - 我必須在C#中執行此操作(C++) - C++ /本機端正忙於編譯和渲染相當龐大的幾何圖形。

所以StringBuilder是正確的 - 即使它可以處理它,我沒有足夠的內存!

我不想做一個純粹的基於文件的解決方案 - waaaaaayyyyyyyy toooooooooooo sloooooooooooowwww!

我不能改變語法 - 我意識到我可以壓縮標準的L-Systems符號,但它是一個語境敏感的語法,所以一旦你得到了它的工作,你就會變得非常迷信擺弄它。

事情我已經考慮

內存映射文件 - 我不介意使用P/Invoke去的原生層來支持的事情,我只是不想重寫整個生產系統中C++ - 但我還沒有發現很多方便的C#庫訪問此功能的方式

低級別的內存管理/頁錯誤等 - 但是,嘿,如果我這樣做,我不如賣掉它作爲產品 - 使緩慢純文件爲基礎的解決方案不看起來這樣一個壞主意

任何人有什麼想法嗎?如何有效地遍歷/操作/擴展生產語法生成的多字符串?

+2

您可能會詳細介紹一下您所做的字符串操作。只需追加寫入?隨機讀取/寫入?在一個塊中隨機讀取/寫入?隨着數據的大小,你顯然需要在磁盤上存儲一些東西,但是你想在RAM中保留一個工作集?你如何識別工作集?我假設一個數據庫不適合這種操作。 – 2010-08-22 18:44:10

+0

這是一個生產系統 - 整個字符串被處理,並且被識別的子字符串被替換爲它們的新作品 數據庫將是'有問題的' 它實際上是一個巨型圖靈機 - 我需要在RAM的頭部保留什麼,但否則可以將其打開和關閉磁盤 – 2010-08-23 02:13:39

+1

有風險陳述明顯,讓我拋出一個可能性:壓縮。這些自引用結構本質上是可壓縮的。或許,不是使用替換來顯式替換擴展後的段,您可以使用一種表示,讓您只需引用擴展,從而允許根據需要重新使用該引用。這似乎是有一個應用程序只使用TB來繪製一片葉子的唯一選擇。 – 2010-08-23 02:53:01

回答

1

你說的很對,典型的壓縮方法涉及預先存在的明文的概念。我在這裏討論的是類似於使用trie data structure而不是字典的想法。它不僅僅是被動壓縮,而是使用一種固有的更緊湊的表示形式,隱含地編碼冗餘。如果你今天的性能達到100G,那麼你的性價比就會超出負擔得起的硬盤的限制,所以你可能會從重新思考解決方案中受益。

+0

請注意,Daniel對內存映射文件的回答是對我的補充。 – 2010-08-24 16:06:41

4

如果你可以升級到.net 4.0然後你可以使用內存映射文件,而無需P/Invoke。

http://msdn.microsoft.com/en-us/library/dd997372.aspx

+0

謝謝! - 正在使用.net 4,不知道 – 2010-08-23 02:14:01

+0

如果您正在處理100G範圍內的大量數據,那麼 - 無論是否 - 您正在處理內存映射和分頁。既然你不願意把這個爛攤子卸載到數據庫上,那麼你也可以在這個級別上解決這個問題。 – 2010-08-23 02:49:19

0

如果這只是爲你的開發機,然後是「回到未來」的解決方案可能是一個RAM Disk,又名RAM驅動器。

RAM磁盤或RAM驅動器是一塊RAM(主存儲器或易失性存儲器),計算機軟件將其看作是內存是磁盤驅動器(輔助存儲器)。

例如一個product。搜索RAM磁盤或RAM驅動器,你會得到一個選擇的聚寶盆。

+0

100 GB不適合RAM驅動器。 – 2010-08-22 19:58:33

+1

那你有沒有過來?尋呼系統,無論是否喜歡,都可能在你的未來。 :-) – JustBoo 2010-08-22 20:27:51