2011-06-25 93 views
-4

我有一個尺寸爲20,000,000 * 3的矩陣存儲在一個文件中。我想非常快速地訪問它。我該怎麼做? 我無法申報那麼大的地圖。我該怎麼辦? 請幫忙。java中的巨大矩陣

+5

當然這是一個稀疏矩陣,對吧? –

+2

取決於矩陣的內容,它是什麼樣的數據? –

+1

http://stackoverflow.com/questions/87679/advice-on-handling-large-data-volumes和http:// stackoverflow的副本。com/questions/140056/java-advice-on-handling-large-data-volumes-part-deux – THelper

回答

2

有許多的可能性:

  • 如果矩陣是稀疏的,將其加載到地圖,留出在哪裏值爲零的條目。

  • 如果矩陣的文件版本具有固定大小的記錄,則創建一個內存映射緩衝區並使用索引來訪問單個單元。

  • 如果訪問模式是連續的,那麼只需讀取它。

  • 等等。

如果你想要一個更具體的答案,你需要提供更多的細節;例如該文件是如何表示的,是矩陣稀疏,什麼是訪問模式,你需要更新矩陣等


矩陣不是稀疏。它基本上包含3行,所有整數。矩陣以格式<row1><row2>row3>存儲在文本文件中。我不需要更新它;我只需要對第1行的值執行一些搜索。

好的。

  • 將文件轉換爲二進制格式。這將使每行佔用相同的字節數並使隨機訪問成爲可能。

  • 搜索row1中的值表明您需要對文件中的列進行排序,以便在row1上對行進行排序。 (或者,如果您還需要按原始行號查找行,請在第1列上創建一個索引。)

  • 然後使用MappedByteBuffer將已排序/索引/轉換的文件映射到內存中,並通過一個IntBuffer

映射文件的總大小應該在180Mb的區域內,這在現今典型的PC上應該不會有問題。

+0

矩陣不是稀疏的,它基本上包含在存儲在文本文件3行,所有ints.Matrix格式爲 我不需要更新它,我只需要對列1中存在的值執行一些搜索 – Anirvana

0

我寧願用Map來使用數組,但是這可能太大了。試着找出矩陣的哪些部分將用於計算,查看一些分而治之/並行矩陣算法,這些矩陣算法通常在較小的矩陣中分解矩陣 - 在結構上或使用矩陣乘法,本徵矩陣和矩陣的其他代數性質。你可以做各種事情,如緩衝和緩存等,以加快訪問磁盤上的數據。