【发布时间】:2015-12-28 03:24:10
【问题描述】:
我是后台进程的新手,如果我做出错误的假设,请随时指出我。
我正在尝试编写一个脚本,将导入数据从一个大型 CSV 文件导入到 Neo4j 数据库中(将其视为数据流,无穷无尽)。 csv 文件仅包含两列 - user_a_id 和 user_b_id,它们映射有向关系。需要考虑的几点:
- 数据可能有重复
- 同一用户可以映射到多个其他用户,并且不保证它何时会再次出现。
我目前的解决方案:我正在使用 sidekiq,并让一名工作人员批量读取文件并派遣工作人员在数据库中创建边。
我遇到的问题:
- 由于我正在接收数据流,因此我无法对文件进行预排序并分配为一个用户建立关系的作业。
- 由于作业是异步执行的,如果两个工作人员正在处理同一节点的关系,我将从 Neo4j 获得一个写锁。
- 假设我解决了写锁问题,如果两个工作人员正在处理重复的记录,我将构建重复的边。
可能的解决方案:构建一个同步队列,并且只有一个工作人员执行写入(似乎 sidekiq 或 resque 都没有选项)。这可能会很慢,因为只有一个线程在工作。
或者,我可以编写自己的实现,它创建一个工作人员来基于 user_id(每个队列一个唯一的 id)构建多个作业队列,并使用 redis 来存储它们。然后为每个队列分配一名工作人员以写入数据库。设置队列的最大数量,这样我就不会耗尽内存,并在队列耗尽所有作业后删除队列(如果我将来看到相同的 user_id 则重新构建它)。 - 这听起来并不简单,所以我更喜欢在深入研究之前使用现有的库。
我的问题是——我可以使用现有的 gem 吗?处理此问题的良好做法是什么?
【问题讨论】:
标签: ruby multithreading neo4j backgroundworker