2014-02-23 60 views
1

我創建了一個動態C++庫,它依賴於大約30 MB或更多MB的數據。現在我試圖找出什麼是最好的方式來存儲這些數據。創建包含大數據的共享庫的最佳實踐

數據本質上是一個擁有超過百萬個元素的大數組。

我想要安裝/卸載庫應儘可能簡單。該庫可以通過其他接口程序(如終端程序,R程序等)進行引用。它只需要支持UNIX

我的一個想法是將數據硬編碼爲一個大數組並將該文件編譯到庫中,但這似乎並不是正確而且有效的做事方式。另外,如果我使文件大於1GB,那麼thigs會失控。

另一個我是將數據文件複製到預定義的路徑,並將庫中的引用硬編碼到該路徑。但是,有些用戶不希望將所有內容安裝到默認安裝路徑。

我的另一個想法是讓每個接口都有能力提供數據文件的路徑,但是看起來接口很麻煩,爲什麼接口應該知道庫數據的位置?

有沒有人知道這種情況下的實踐?

+0

您可以選擇使用內存映射文件。如果只需要訪問一部分數據,可能會更有益。 –

+0

我可以使用它,但首先我需要將信息存儲在某處。這就是我目前的問題是關於 – user1047833

回答

2

我不認爲有一個「正確」的答案。

將數據存儲在文件中是沒有問題的,只要數據的變化頻率比您希望發佈新庫的時間更長 - 無論如何您都需要以某種方式存儲數據量,只要編譯器在將數據存儲在共享庫中時並不會做出糟糕的工作,就我所見,它並不比其他選項差。

只有當您希望數據更改頻率超過您希望發佈新共享庫時,纔有用輔助文件。它增加了打開和閱讀輔助文件的額外複雜性 - 缺點是,您還需要添加檢查它是否正確/存在,並且處理它的代碼不在那裏。

如果你有一個輔助文件,有一些重新定義位置的方法肯定會有好處。

如果數據真的很大,可能需要使用壓縮格式。您仍然可以將壓縮數據作爲數據存儲在共享庫中,並使用可從中擴展數據的壓縮庫。或者你可以使用從外部文件中讀取庫...

最後,它真的可以歸結爲:

  1. 你將如何使用數據 - 你總是需要所有這一切,或者你有時需要一些嗎?如果後者,你怎麼知道哪些位?
  2. 數據更改的頻率。
  3. 如果數據可以被壓縮,如果是的話,你用什麼方法壓縮它?

我不確定在共享庫上是否有任何直接的大小限制 - 如果你需要1GB的數據,那麼你需要1GB的內存空間,所以它不像你保存內存[假設你總是需要所有的數據和/或無法確定你需要哪些部分]。

+0

好的謝謝。我將嘗試使用庫來編譯數據 - 這很快給我帶來了一個問題。堆棧對我來說太小,你不能用預定義的值定義向量或堆數組。看到我有成千上萬的值,我只是想做一些像int [] pValues = {5,...,10}。任何想法,我怎麼能做到這一點? – user1047833

+1

使用'const static int pValues [] = {...}'? –

1

您可以使用測試文件並將數據保存爲壓縮二進制格式。然後分發文本文件和dll/lib在一起