我正在尝试处理存储在s3中的.jl.gz格式的数百个不同文件。我需要在这些文件中获取每个1M json对象的不同部分,并将它们移动到sql数据库,mongodb和elasticsearch。
这花了太长时间。所以,到目前为止我所尝试的是将所有文件都送入SQS队列然后:
1) Running multiple screen sessions on ec2 instances to read through them faster.
- This worked, but was not ideal because of the manual oversight needed
- From this, I wondered about a way to do the equivalent of running multiple screen sessions from within python and found multiprocessing module.
多处理模块看起来像我想要的那样,但我一直遇到内存错误:
OSError: [Errno 12] Cannot allocate memory
为文件中的每一行创建进程或为文件中的每一行创建队列时。请参阅下面的创建队列的代码。
from multiprocessing import Process, Lock, Value, Pool, Queue
def create_mp_queue(self, gzf):
q = Queue()
for line in gzf:
q.put(line)
return q
workers = 2
gzf = gzip.GzipFile(fileobj=f)
c_queue = create_mp_queue(gzf)
for x in xrange(workers):
p = Process(target=self.company_to_s3, args=(company_queue,))
p.start()
processes.append(p)
for p in processes:
p.join()
那么,我如何限制队列的大小以便我不会耗尽内存?我在ec2上,所以我可以增加服务器的大小,但更喜欢灵活的解决方案,可以在任何服务器上实现。
我对使用python快速读取大量数据的其他模块,方法,提示,技巧等持开放态度。
答案 0 :(得分:0)
我使用了一个全局计数器,我传递给每个处理器,而不是一个大的数字队列。