2011-07-12 44 views
2

我正在金融行業工作。我們想要推出數據庫命中數據處理。這是非常昂貴的。所以我們打算採用按需緩存邏輯。 [運行時插入&運行時查找]在進程內存中緩存大量數據

有沒有人在超過1000萬記錄的緩存邏輯的實施工作?每個記錄約160 - 200字節。

我面臨着不同方法的缺點。

  1. 不能使用STL的std ::地圖實施的重要基地緩存註冊表。 插入和查找200000記錄後非常慢。
  2. 共享內存或存儲器映射文件是種開銷用於高速緩存數據, 因爲這些數據不被跨越進程使用sqlite3的
  3. 內存&平面文件的應用數據庫可以是 值得共享。但在2-3百萬條記錄之後,它的查詢速度也很慢。
  4. 進程內存對自己的內核內存消耗可能有一些限制。我的 假設是在64位機器上的32位機器上演出2演出。

如果你遇到過這個問題並且以任何方式解決,請給我一些建議。

感謝

+2

DB索引通常通過BTrees實現,而不是std :: map(R&B二叉樹)。 BTrees對於你所談論的尺度更有效。 – littleadv

+0

您可以在進程之間使用共享內存和內存映射文件。至少在linux上。你在使用什麼操作系統? –

+0

這是一個關鍵價值商店還是更復雜的東西? –

回答

1

如果緩存是一個簡單的key-value存儲,你不應該使用std::map,其中有Ø(日誌ñ)查找,但std::unordered_map,其中有Ø(1)查找。如果您需要排序,則只應使用std::map

這聽起來像表現是你以後,所以你可能想看看Boost Intrusive。您可以輕鬆地將unordered_maplist組合起來創建一個高效LRU。

0

讀到的一切到內存中,並創建R代表鍵訪問& B +樹。

http://www.mit.edu/~emin/source_code/cpp_trees/index.html

在最近的一個項目中,我們曾與一些10S M唱片公司的數據庫,並使用這種策略是。

從您的帖子中,您的數據權重爲2GB。隨着開銷,它會出現兩倍。對於任何64位體系結構來說都沒有問題。

+1

@Daniel .... std :: map只在內部使用紅黑樹。數據也一次不可用。緩存在指數上隨着時間增長。在早上它可能沒有記錄,但在一天結束時,它可能有10毫米的記錄。 – Naveen

+0

你需要什麼時間閱讀和插入?另外,你是否需要某種迭代器? –

+0

另外考慮到這一點:插入時間並不重要,因爲它會被吃掉,因爲數據將來自「外部」,因此取出將會很慢。所以你需要關注讀取。我相信你std :: map使用RB樹,但是我知道我們的實現在幾微秒內從我們的數據結構返回了1000條記錄。 –

0

我最近更改了我們的產品(3D醫學卷瀏覽器)的內存分配以使用舊的內存映射文件。

的優點是:

  • 我可以分配所有的物理內存,如果我喜歡(我的32位應用程序有時需要一個64位計算機上超過4個演出)
  • 如果只映射部分,你的地址空間在很大程度上免費供您的應用程序使用,從而提高可靠性。
  • 如果內存不足,事情就會減慢,沒有崩潰。

在我的情況下,它只是數據(大部分是隻讀的)。如果你有一個更復雜的數據結構,這將比使用「普通」對象更多的工作。

實際上你可以在不同的進程之間共享這些進程(如果它們是由真實文件支持的話)。這可能會有不同的表現,我沒有這方面的經驗。