2013-02-08 51 views
2

在我的Ruby On Rails應用程序中,我必須存儲(相對)每個文檔大約300x300元素的大矩陣(浮點值,大多數不同)。在每次檢索文檔時,必須加載完整的矩陣以進行自定義計算。矩陣也經常更新(因此寫入性能和內存緩存也是一個問題)。在Rails應用程序中存儲大型矩陣

什麼是存儲這種矩陣的好方法(性能明智)?浮現在我的腦海一些替代方案:

  1. 一個表中的列rowcolumnvalue。但是,我猜想提取並存儲整個矩陣(大約90000個單元格)對於每個請求都不是個好主意(有些內存緩存會有所幫助)。
  2. 存儲在文本字段/列中序列化的矩陣。從性能的角度來看,你有什麼想法與1相比?
  3. 使用一些文檔數據庫(例如Mongo)並將整個矩陣存儲在文檔的一個字段中(不確定與2.相比效益在哪裏)。
+0

怎麼樣有R或Matlab等掛鉤的矩陣工作,讓他們做的重荷? – fuzzyalej 2013-02-08 16:02:33

+0

在這裏有點類似的問題的答案,儘管這不是稀疏的數據,所以不是所有的都是相關的:http://stackoverflow.com/a/2599384/178651 - 我認爲的訣竅是首先考慮存儲的方式/從數據庫中有效地檢索它,然後你可以確定在Rails中你需要做多少解析,比較等等。 – 2013-02-08 19:15:44

+1

鑑於這是您需要的獨特場景,我建議您嘗試一些看起來最好的選項。我的第一個想法是將它存儲爲一個大塊(認爲CSV)(選項#2)。但是,我從來不需要存儲任何類似於需求的東西,因此很難預測。我不會僅僅爲此使用MongoDB。您的描述聽起來不像您需要數據庫的其他功能。 – WiredPrairie 2013-02-08 19:26:24

回答

0

任何類型的ACID兼容存儲的按需寫入和檢索性能將成爲一個問題。作爲一種最佳實踐,我會建議一個緩存繁重的策略,將您的矩陣保留在內存中,如果您需要在多個服務器上使用它,也許使用memcache。然後你可以讀取和寫出你的請求週期,隨後你不必關心寫性能,並且可以使用任何東西(比如MySQL中的文本字段或其他)。

要做到這一點,我建議編寫自定義矩陣類,執行以下操作:

  • 檢查了它的副本緩存的數據,如果不提供,從數據庫加載和填充緩存。
  • 當您的緩存副本更新時,以異步方式寫入數據庫。
  • 提供優化的數據接口爲您的代碼