Java 由多个进程同步轮询文件中的对象列表
用例: 我有一个带有ID的文件(大约500k) 我的应用程序读取并处理这些文件(处理每个id的工作量很大)。所以总的来说,这一过程需要大量的时间和内存 我们需要实现的是通过扩展进程的数量(在单独的机器上运行Java进程),并将整个ID列表划分为一些固定的批大小,以便5个进程开始处理文件中的项目,并在下一批处理完成时提取下一批。 如果文件中的项目总数为100,我的批量大小为5,共有3个过程,那么处理应该如下Java 由多个进程同步轮询文件中的对象列表,java,multiprocessing,distributed-computing,polling,Java,Multiprocessing,Distributed Computing,Polling,用例: 我有一个带有ID的文件(大约500k) 我的应用程序读取并处理这些文件(处理每个id的工作量很大)。所以总的来说,这一过程需要大量的时间和内存 我们需要实现的是通过扩展进程的数量(在单独的机器上运行Java进程),并将整个ID列表划分为一些固定的批大小,以便5个进程开始处理文件中的项目,并在下一批处理完成时提取下一批。 如果文件中的项目总数为100,我的批量大小为5,共有3个过程,那么处理应该如下 过程1:1-5 过程2:6-10 过程3:11-15 这样,如果流程2在其他流程之前完
- 过程1:1-5
- 过程2:6-10
- 过程3:11-15
请注意,由于内存限制,我们无法在单个进程/主机上使用多线程
请有人提出解决方案/参考资料,说明如何实现这一目标 听起来你好像遇到了分布式计算问题。您有一组“要处理的事情”,并且希望跨多台机器进行处理。最简单也是最典型的方法是将这些“要处理的事情”放入一个分布式队列,如AmazonSQS或RabbitMQ(一个文件不起作用)
- 确保在处理完成后从队列中删除该项目(并根据处理所需的时间设置合理的可见性超时),以避免其他工作主机在不应该的情况下拾取该项目
- 如果需要,可以从队列中一次提取一个,也可以分批提取。我建议在每个主机上设置一个线程池来执行poll/work/delete循环,这样只需更改线程池的大小就可以轻松调整每个主机的并发量
通过使用这样的分布式队列,一台主机接收的项目将不会被其他主机看到(从而避免双重处理)。由于内存限制,我们无法在单个进程上使用多个线程来完成此任务”,这是没有意义的。一个进程中的多个线程比同一台机器上的多个进程占用更少的空间。您可能需要使用
-Xmx
命令行标志来增加最大堆大小。很抱歉不清楚,但是对于多个进程,我打算在不同的机器上运行它们