将1M行jsonlines文件分解为单独的json文件 - python

时间:2015-02-26 19:54:42

标签: python memory queue multiprocessing

我正在尝试处理存储在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快速读取大量数据的其他模块,方法,提示,技巧等持开放态度。

1 个答案:

答案 0 :(得分:0)

我使用了一个全局计数器,我传递给每个处理器,而不是一个大的数字队列。