4

9 个进程在我们的系统中同时写入相同的 CSV 输出。并且输出速度快。每天大约有 1000 万行新行。要编写 CSV 文件,我们使用 Python2.7 的 csv 模块。

最近我注意到 CSV 文件中有一些混合行(参见以下示例)。

例如

"name", "sex", "country", "email"
...# skip some lines
"qi", "Male", "China", "redice
...# skip some lines
"Jamp", "Male", "China", "jamp@site-digger.com"
...# skip some lines
@163.com"

正确的输出应该是:

"name", "sex", "country", "email"
...# skip some lines
"qi", "Male", "China", "redice@163.com"
...# skip some lines
"Jamp", "Male", "China", "jamp@site-digger.com"
...

如何避免这样的冲突?

4

3 回答 3

2

我知道没有直接的方法。

一种常见的解决方法是在“生产者”和“输出者”之间分担责任。

再获得一个负责从多进程队列输出 CSV 的进程,并将所有“生产者”进程推送到该队列。

我建议查看python 的多处理模块,尤其是关于queues的部分。如果您在尝试时遇到困难,请在此处提出新问题,因为这可能会变得很棘手。

另一种方法是使用“巨型锁”,这将要求每个进程等待资源的可用性(例如使用系统互斥锁)。这将使代码更容易,但可扩展性较差。

于 2013-11-07T08:18:43.020 回答
1

正如布鲁斯解释的那样,唯一经过验证的解决方案是让一个进程接受来自“生产者”进程的输出并写入文件。可以是队列/消息系统,或者只是一个普通的旧 SQL 数据库(从中可以轻松输出 csv 文件)。

于 2013-11-07T08:22:47.467 回答
1

作为第一个也是最简单的尝试,我会尝试始终刷新()输出,这将强制 IO 在接受下一个数据之前写入文件。

于 2013-11-07T08:40:37.670 回答