2016-04-27 59 views
1

我正在做一些不尋常的數據操作。我有36,000個輸入文件。然後可以一次加載到內存中。我想把每個文件的第一個字節放在一個輸出文件中,然後再次執行第二個文件,依此類推。它不需要以任何特定的順序來完成。由於輸入文件是壓縮加載它們需要更長的時間,並且它們不能一次讀取1個字節。我最終得到每個輸入文件的一個字節數組。閱讀成千上萬的文件並寫入數百萬的Java文件

輸入文件約爲1-6MB未壓縮和〜.3-1MB壓縮(有損壓縮)。輸出文件最終成爲輸入文件的字節數。 ~36KB在我的例子。

我知道ulimit可以在Linux操作系統上進行設置,並且可以在Windows上進行等效設置。儘管可以提高這個數字,但我不認爲任何操作系統都會同時寫入數百萬個文件。

我目前的解決方案是製作3000左右的緩衝寫入器流,並依次加載每個輸入文件,並將1個字節寫入3000個文件,然後關閉文件並加載下一個輸入。有了這個系統,每個輸入文件需要打開大約500次。

整個操作需要8天才能完成,並且只是一個更實際的應用程序的測試用例,它將以更大的輸入文件,更多的輸入文件和更多的輸出文件結束。

捕獲內存中的所有壓縮文件,然後根據需要解壓縮它們聽起來不切實際,並且不會擴展爲較大的輸入文件。

我認爲解決方案是緩衝我可以從輸入文件中獲得的內容(因爲內存約束不允許緩衝所有內容),然後依次寫入文件,然後再重複一遍。

但是,我不知道是否有更好的解決方案,使用我不會閱讀的東西。

編輯 我很感激快速的迴應。我知道我在應用我正在做的事情時含糊不清,我會盡力糾正這一點。我基本上有一個三維數組[圖像] [X] [Y]我想遍歷每個圖像,並保存每個圖像上的特定像素的每種顏色,併爲所有圖像做到這一點。問題是內存限制。 ()DataList.get(fileList.get(k)).getRaster()。getDataBuffer())。getData();方法詳細信息

這是我用來加載圖像,因爲它負責解壓縮和跳過標題。

我不會將它編輯爲視頻,因爲我必須獲取一個幀,然後將其轉換爲圖像(代價高昂的顏色空間轉換),然後將其轉換爲byte []以獲取像素數據int RGB色彩空間。

我可以加載每個圖像,並將其分成〜500個部分(Y大小),並寫入單獨的文件,我保留打開並寫入每個圖像。輸出很容易在演出中。生成的文件可以完全加載到內存中,並轉換爲用於順序文件寫入的陣列。

中間步驟的確意味着我可以在網絡上拆分負載,但我試圖在低質量筆記本電腦上使用4gb ram,無GPU和低質量i7完成。

在閱讀davidbak的回覆之前,我沒有考慮過將任何東西保存爲文件作爲中間步驟。大小是唯一使這個問題變得不重要的東西,我現在看到大小可以分成更小的更易於管理的塊。

+0

不確定部分3是什麼。你需要解壓縮一個文件並將前幾個字節追加到一個文件中?爲什麼要3,000個文件?如果你有超過8臺服務器,可以使用hadoop – tgkprog

+0

對於一個給定的運行,輸入都是相同的大小,但運行之間的大小可能非常大,文件數量也非常大。如果它是每個1MB和36000個文件,那麼它將是一個36GB的文件,這是事情的低端。然後我可以以一種非常可預見的方式讀取該文件。我需要的每個字節都是1MB(一個輸入文件的大小),但要記住把它組合成一個大文件的時間,這真的快得多嗎?它會加載並卸載36個演出的每個字節到內存中,以完成1個文件。它會這樣做100萬次。 –

回答

5

三相操作:

第一階段:讀取所有輸入文件,一次一個,並寫入到輸出文件。輸出文件將以記錄爲導向 - 比如8個字節的記錄,4個字節的「字符偏移量」和4個字節的「字符碼點」。當你讀文件時,字符偏移量從0開始,當然,如果輸入文件是「ABCD」,你正在寫(0,A)(1,B)(2,C)(3,D) 。每個輸入文件打開一次,順序讀取並關閉。輸出文件打開一次,連續寫入,然後關閉。

第二階段:使用外部排序對4字節字符偏移量字段上的中間文件的8字節記錄進行排序。

第三階段:打開已排序的中間文件,並通過它。每次字符索引字段更改時打開一個新的輸出文件,並向該輸出文件寫入屬於該索引的所有字符。輸入文件打開一次並順序讀取。每個輸出文件都打開,按順序寫入,然後關閉。

Voilà!您需要中間文件的空間,以及良好的外部排序(以及工作文件的空間)。

正如@Jorge所言,第一階段和第二階段都可以並行化,事實上,這種工作(階段1到階段3)完全在mapreduce/hadoop的最佳位置。

2

你在那裏很模糊,但是,也許看看mapreduce會有幫助。看起來可以分發這種工作。

隨着您提供的額外信息,我真的不知道如何在通用硬件上執行該任務,如您提到的4GB i7。你的問題看起來像一個圖像疊加算法,從很多不太好的圖像中獲得體面的圖像,這是天文圖像處理中的一個典型問題,我相信它會應用到其他區域。對天文圖像處理進行很好的查找可能會很好地利用您的時間,有一種名爲registax(不確定它是否仍然存在)的軟件可以做類似的事情,但可以使用視頻文件。

做一些餐巾數學,如果你花1秒鐘打開一個文件,你會得到只有文件打開10小時。

一種方法是獲得一些FAST磁盤(SSD),我會將所有文件解壓縮爲一些原始格式並將它們存儲在磁盤上,從那裏您將不得不使用文件指針直接從這些文件不會將它們存入內存,並直接在磁盤上將輸出寫入文件。

+0

感謝指向RegiStax的指針([仍然存在](http://www.astronomie.be/registax/)) - 我完全不知道這類圖像處理軟件。 – davidbak

+0

很高興幫助! –