首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由多个进程同步轮询文件中的对象列表

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

Stack Overflow用户
提问于 2018-09-03 02:09:26
回答 1查看 100关注 0票数 0

用例:我有一个包含id的文件(大约500 k),我的应用程序读取并处理这些文件(每个id的处理都很大)。因此,总的来说,这个处理需要大量的时间和内存。

我们需要实现的是通过扩展进程的数量(在不同的框/机器上运行Java进程),并将in的整个列表按某些固定的批处理大小划分,这样5个进程就开始处理文件中的项,并在完成处理时获取下一个批处理。例如:如果文件中的总项为100,而我的批处理大小为5,总共有3个进程,那么处理应该如下

  • 进程1: 1-5
  • 进程2: 6-10
  • 进程3: 11-15

这样,如果流程2在其他进程之前完成,那么它将开始处理16-20,并将此通知其他进程,以便下一个可用的流程选择项目21-25。

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

请有人提出解决方案/参考如何实现。

EN

回答 1

Stack Overflow用户

发布于 2018-09-03 03:12:41

听起来你有一个分布式计算问题。您有一组“要处理的东西”,并且希望在多台机器上进行处理。最简单和最典型的方法是将这些“事务处理”放到一个分布式队列中,比如Amazon或RabbitMQ (一个文件不能工作)。

  1. 有一个进程(并且只有一个进程)负责将文件传输到分布式队列。如果您可以完全避免文件(并且让任何写入文件的内容只写到队列中),那么可以这样做。
  2. 设置多个主机(考虑亚马逊EC2)从该队列中读取,并进行处理。
    • 确保在处理完成后从队列中删除项(并根据处理所需的时间设置合理的visibilty超时),以避免另一个工作主机在不应该的情况下拾取该项目。
    • 如果您愿意,可以一次一次或分批地从队列中取出。我建议在每台主机上设置一个线程池来执行轮询/工作/删除循环,因此只需更改线程池大小就可以轻松地调整每个主机的并发量。

通过使用像这样的分布式队列,由一个主机获取的项将不会被其他主机看到(从而避免了双重处理)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52142423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档