我們使用JDK 7 watchservice觀察可以有xml或csv文件的目錄。這些文件放在線程池中,稍後處理並推送到數據庫中。此應用程序永遠運行,用於監視目錄並在可用時保持處理文件。 XML文件很小並且不需要時間,但是每個csv文件可以包含超過8萬條記錄,因此處理需要時間才能放入數據庫。 Java應用程序在從線程池處理15個csv文件時,會給我們帶來outofmemory錯誤。有沒有什麼辦法在csv文件進入線程池時,可以按順序處理,即一次只處理一個。按順序處理線程池執行文件
0
A
回答
0
你可以試試:
- 使用
-Xmx
JVM選項 使用不同的執行,以減少一次處理的文件數量增加JVM的內存。一個大刀闊斧的解決方案是使用一個
SingleThreadExecutor
:public class FileProcessor implements Runnable { public FileProcessor(String name) { } public void run() { // process file } } // ... ExecutorService executor = Executors.newSingleThreadExecutor(); // ... public void onNewFile(String fileName) { executor.submit(new FileProcessor(fileName)); }
1
Java應用程序給我們的內存溢出錯誤,當有來自線程池得到處理15個CSV文件。有沒有什麼辦法在csv文件進入線程池時,可以按順序處理,即一次只處理一個。
如果我理解,如果您超過某個閾值,您希望停止添加到池中。有一種簡單的方法可以通過使用阻塞隊列和被拒絕的執行處理程序來實現。
請參見下面的回答:
要總結一下,你做的東西像下面這樣:
// only allow 100 jobs to queue
final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(100);
ThreadPoolExecutor threadPool =
new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, queue);
// we need our RejectedExecutionHandler to block if the queue is full
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
// this will block the producer until there's room in the queue
executor.getQueue().put(r);
} catch (InterruptedException e) {
throw new RejectedExecutionException(
"Unexpected InterruptedException", e);
}
}
});
這將意味着它會阻止增加了排隊,不應該耗盡內存。
1
我會採取不同的途徑來解決你的問題,我猜你除了當你開始將太多的數據讀入內存時,都擁有一切。
不知道你如何閱讀csv文件,建議使用LineReader並閱讀例如500行處理它們,然後讀取下一行500行,所有大文件只能以這種方式處理,因爲無論你增加了多少內存參數,只要有更大的文件需要處理,就會發生內存不足,所以使用可以批量處理記錄的實現。這需要一些額外的編碼工作,但無論您需要處理多大的文件都不會失敗。
乾杯!
相關問題
- 1. 線程池是否按順序運行?
- 2. 按順序運行批處理文件
- 3. 線程池執行程序
- 4. 按順序執行批處理指令
- 5. java thead池執行程序如何處理中斷線程
- 6. Java線程池ExecutorService:線程執行順序
- 7. C++線程池中的線程執行順序
- 8. 按順序執行python線程
- 9. 順序處理比池處理更快
- 10. 線程的執行處理程序
- 11. CUDA線程執行順序
- 12. boost ::線程執行順序
- 13. 執行線程的順序
- 14. 線程執行順序
- 15. 按數字順序處理文件
- 16. 線程池執行程序接受customqueue
- 17. JavaScript事件處理程序的執行順序
- 18. DoubleClick Command和DoubleClick事件處理程序的執行順序
- 19. JS事件處理程序的執行順序
- 20. 確保jQuery事件處理程序執行順序
- 21. JavaScript事件處理程序的執行順序
- 22. Java線程執行不按順序執行
- 23. 執行並行線程池
- 24. ExtJS按鈕不執行處理程序
- 25. 線程池執行順序並將未來傳遞給另一個線程
- 26. 爲什麼我的多線程程序按順序執行?
- 27. 批處理命令執行順序
- 28. 按順序在各個文件夾中執行程序
- 29. 如何使用批處理文件按字母順序執行SQL腳本
- 30. 在什麼線程上執行事件處理程序?
如何使用Executors#newSingleThreadExecutor()'? – Katona
需要爲csv文件創建單獨的執行程序... newSinglethreadExecutor()似乎做得很好...任何示例都會很棒.. – user2751620