我從文件中加載了一個2D數組,它是15,000,000 * 3個整數(最終將是40,000,000 * 3)。現在,我使用dataInputStream.readInt()
來順序讀取整數。它需要約15秒。我可以使其顯着(至少3倍)更快,或者這個速度可以達到我能得到的速度嗎?什麼是從文件中加載大2D二維int數組的最快方法?
4
A
回答
7
是的,你可以。從benchmark of 13 different ways of reading files:
如果你必須選擇最快的方法,這將是其中之一:
FileChannel
與MappedByteBuffer
和陣列讀取。使用ByteBuffer
和數組讀取。FileChannel
與包裝數組ByteBuffer
和直接數組訪問。
對於最好的Java讀取性能,有4件事情要記住:
- 通過 一次讀取陣列的時間,而不是字節最小化I/O操作。一個8KB的數組是一個很好的大小(這就是爲什麼它是
BufferedInputStream
的默認值)。 - 通過一次獲取數組數據來最小化方法調用,而不是一次一個字節 。使用數組索引來獲取數組中的字節。
- 如果您不需要線程 安全性,請最小化線程同步鎖。要麼對線程安全類進行更少的方法調用,要麼使用 非線程安全類如
FileChannel
和MappedByteBuffer
。 - 儘量減少JVM/OS,內部緩衝區和應用程序陣列之間的數據複製。使用帶有內存映射的
FileChannel
,或直接使用 或包裝數組ByteBuffer
。
7
將您的文件映射到內存!
Java 7的代碼:
FileChannel channel = FileChannel.open(Paths.get("/path/to/file"),
StandardOpenOption.READ);
ByteBuffer buf = channel.map(0, channel.size(),
FileChannel.MapMode.READ_ONLY);
// use buf
詳情請參閱here。
如果你使用Java 6,你必須:
RandomAccessFile file = new RandomAccessFile("/path/to/file", "r");
FileChannel channel = file.getChannel();
// same thing to obtain buf
,你甚至可以在緩衝區使用.asIntBuffer()
如果你想。當你需要閱讀時,你只能閱讀你實際需要閱讀的內容。 和它不影響你的堆。
+0
如果我能接受兩個答案,這也是一個很好的答案,upvoted。 – fhucho
相關問題
- 1. 將大文本文件加載到int數組中的最快方法
- 2. 什麼是在Java中複製2D int數組的最快方法?
- 3. 在numpy中,用一維數組乘以三維數組的第二維的最快方法是什麼?
- 4. 什麼是在二維數組中搜索字符串的最快方法
- 5. 在Python中複製二維數組的最快方法是什麼?
- 6. 在Matlab中加載數據的最快方法是什麼?
- 7. 在Delphi中讀取大文件的最快方法是什麼?
- 8. 在Ruby中讀取大文件的最快方法是什麼?
- 9. 在二維數組中尋找最大值的快速算法
- 10. 什麼是在2D numpy數組中對角插入元素的最快方法?
- 11. 將大量數據從內存寫入文件的最快方法是什麼?
- 12. C - 獲取文件大小的最快方法是什麼?
- 13. 在iPhone上寫大文件的最快方法是什麼?
- 14. 將數據從文本文件加載到二維數組中?
- 15. 最快的方式從二維數組中獲取值
- 16. 什麼是在PHP中多維數組中回顯值的最快方法?
- 17. 什麼是具有float64組件的二維數組的最終大小
- 18. 將文件加載到PHP數組中,最好的方法是什麼?
- 19. 在matlab中加載多個圖像tiff文件的最快方法是什麼?
- 20. 什麼是在iPhone上加載大圖片的最快方式?
- 21. 在iPhone上加載大圖的最快方式是什麼?
- 22. 從Python中的二維數組中選擇列的最快方法?
- 23. 將文本從文件加載到二維數組中(C++)
- 24. 在Ruby中定義二維數組最明確的方法是什麼?
- 25. 將數據從文件加載到二維數組中
- 26. 什麼是簡單合併文件的最快捷方式,什麼是分割數組的最快捷方式?
- 27. 將多個numpy數組加載到spark rdd的最快方法是什麼?
- 28. 在jQuery Mobile中加載大型嵌套列表的最快方法是什麼?
- 29. 確定二維Ruby數組是否爲空的最有效方法是什麼?
- 30. 什麼是從網頁打開excel文件的最快方法?
想想如何將陣列布置在內存中。內存是1D ... – theunamedguy
@HovercraftFullOfEels我當然是緩衝:) – fhucho
40密耳* 3英寸* 4個字節每個int = 480 MB。您的驅動器可以多快讀取這麼多數據? – Lyth