2012-05-01 180 views
1

我寫了使用200萬個陣列整數值的計劃。但是,它一次只能使用200個陣列。 我有200輛智能汽車,可以在10000塊地塊上移動(根據GPS值劃分)。每個塊都有一個129x28的數組,它具有整數值。當任何汽車進入一個新的塊時,它必須檢索與這個塊有關的數組,然後它使用該數組中的一個值。然後它根據該值做出決定,然後繼續前進等等。因此,整個200輛汽車和10000輛汽車的系統,每輛汽車都有自己的陣列不同值,陣列總數爲200萬。我需要簡單地在時間位置= 200個陣列檢索每輛車的1個陣列數組保存到硬盤

數組將在應用程序開始時創建並填充零,然後應用程序將開始填充這些數組,最後它只會使用它們。所以我編寫了一個代碼來在程序中創建這些數組。

我不能在文件中的數組存儲在HD和檢索他們時,我想要什麼?

更新

因爲我有200萬個陣列,我不能存儲&檢索1-1.9秒200個陣列我下分級研究使用更少的環境特點,結束了與使用200萬個陣列的大小7×28,其使用7 * 28 * 10 000 * 4(整數)* 200(汽車)字節 如果RAM,其僅消耗1.6 GB。祝你好運,如果你有類似的問題,下午,如果你是在類似的情況,我希望我能夠提供幫助。

+3

在哪裏是來自數據? –

+0

這不是200萬個陣列,這是200個汽車看的10,000個區塊(大小129x28的表格)。我希望你正在做一些事情來加快你對塊的查找 - 你可以使用hashmap。我更關心你的'塊' - 你確定桌子結構是最好用的嗎?有些東西讓我覺得「關閉」。 –

+0

@ X-Zero:10,000個模塊,200輛汽車,每個模塊都有一個129x28陣列的獨特副本。 200 * 10 000 = 2 000 000個陣列。至於搜索我有二進制搜索花費日誌10 0000 = O(14)來查找要檢索的數組和O(15)的恆定時間來檢索檢索數組中的確切值。 我甚至考慮過「在同一時間」使用數組的RAM容量,我在代碼中的缺陷是我沒有考慮我不使用的數組,後來我發現即使這些數組將駐留在RAM也是。 –

回答

2

一個相當簡單的解決辦法是使用的ObjectOutputStream和ObjectInputStream的類來寫和讀你的陣列。

下面是一些示例代碼寫入陣列磁盤:

int [][] array = new int [129] [28]; 
    // fill in your array here 
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName)); 
    out.writeObject(array); 
    out.close(); 

下面是一些示例代碼從磁盤中讀取一個以前保存的陣列:

ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); 
    int [] [] inArray = (int [] []) in.readObject(); 
    in.close(); 
+0

謝謝。但不在那裏去自動化fileName。我的意思是,我需要命名將保存陣列的文件(200萬個陣列= 200萬個文件)。那麼是否有自動化文件命名來保存每個陣列? –

+0

這是一個解決方案。有200輛汽車,每輛汽車超過10,000塊。因此,您可以爲每輛車設置一個單獨的子目錄,並在每個子目錄中存儲10,000個文件。因此,例如,/carfiles/car99/block250.dat將包含汽車99區塊250的數據。 –

+0

繼續上述評論。但是,對於200萬個數組,數據庫建議是一個很好的選擇。用包含數據的BLOB(Binaary Large Object)設置由汽車編號和程序段號索引的表格。您可以使用上面的對象流代碼,並結合ByteArrayOutputStream和ByteArrayInputStream(而不是FileOutputStream和FileInputStream)將數據寫入/讀取存儲在BLOB中的字節數組。 –

4

你有沒有使用database考慮?即使在磁盤上逗號分隔的文本文件(認爲Excel)也可以工作。你的數據源究竟是什麼?

+0

程序在根據某些事件啓動時將填充的整數(AI汽車項目)。所以數組的值將在0-200之間。 –

+0

作爲文本存儲會不必要地增加存儲大小和檢索時間,並可能使得隨機訪問變得棘手。 –

+0

@ Oli C.你認爲我應該建立一個數據庫嗎?你知道從HD檢索文件需要多長時間? –