我们使用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