我正在做一些不尋常的數據操作。我有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的回覆之前,我沒有考慮過將任何東西保存爲文件作爲中間步驟。大小是唯一使這個問題變得不重要的東西,我現在看到大小可以分成更小的更易於管理的塊。
不確定部分3是什麼。你需要解壓縮一個文件並將前幾個字節追加到一個文件中?爲什麼要3,000個文件?如果你有超過8臺服務器,可以使用hadoop – tgkprog
對於一個給定的運行,輸入都是相同的大小,但運行之間的大小可能非常大,文件數量也非常大。如果它是每個1MB和36000個文件,那麼它將是一個36GB的文件,這是事情的低端。然後我可以以一種非常可預見的方式讀取該文件。我需要的每個字節都是1MB(一個輸入文件的大小),但要記住把它組合成一個大文件的時間,這真的快得多嗎?它會加載並卸載36個演出的每個字節到內存中,以完成1個文件。它會這樣做100萬次。 –