Java 由多个进程同步轮询文件中的对象列表

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在其他流程之前完

用例: 我有一个带有ID的文件(大约500k) 我的应用程序读取并处理这些文件(处理每个id的工作量很大)。所以总的来说,这一过程需要大量的时间和内存

我们需要实现的是通过扩展进程的数量(在单独的机器上运行Java进程),并将整个ID列表划分为一些固定的批大小,以便5个进程开始处理文件中的项目,并在下一批处理完成时提取下一批。 如果文件中的项目总数为100,我的批量大小为5,共有3个过程,那么处理应该如下

  • 过程1:1-5
  • 过程2:6-10
  • 过程3:11-15
这样,如果流程2在其他流程之前完成,那么它将开始处理16-20并通知其他流程,以便下一个可用流程选择项目21-25


请注意,由于内存限制,我们无法在单个进程/主机上使用多线程


请有人提出解决方案/参考资料,说明如何实现这一目标

听起来你好像遇到了分布式计算问题。您有一组“要处理的事情”,并且希望跨多台机器进行处理。最简单也是最典型的方法是将这些“要处理的事情”放入一个分布式队列,如AmazonSQS或RabbitMQ(一个文件不起作用)

  • 让一个进程(并且只有一个)负责将文件传输到分布式队列。如果可以完全避免该文件(并让正在写入该文件的内容只写入队列),请改为这样做
  • 设置多个主机(考虑AmazonEC2)从该队列读取数据,并进行处理。
    • 确保在处理完成后从队列中删除该项目(并根据处理所需的时间设置合理的可见性超时),以避免其他工作主机在不应该的情况下拾取该项目
    • 如果需要,可以从队列中一次提取一个,也可以分批提取。我建议在每个主机上设置一个线程池来执行poll/work/delete循环,这样只需更改线程池的大小就可以轻松调整每个主机的并发量

  • 通过使用这样的分布式队列,一台主机接收的项目将不会被其他主机看到(从而避免双重处理)。

    由于内存限制,我们无法在单个进程上使用多个线程来完成此任务”,这是没有意义的。一个进程中的多个线程比同一台机器上的多个进程占用更少的空间。您可能需要使用
    -Xmx
    命令行标志来增加最大堆大小。很抱歉不清楚,但是对于多个进程,我打算在不同的机器上运行它们