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

将1M行jsonlines文件分解为单独的json文件-python,python,memory,queue,multiprocessing,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 idea

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

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

您能提供有关数据库中实际输入内容的详细信息吗?是需要查看多个json对象还是一个就足够了?还有,json对象是如何以.jl.gz格式存储的?每行一个json对象还是整个文件一个json对象?如果是整个文件,那么这些json对象的最大大小是多少。~1000个大的.jl.gz文件。每个.jl.gz文件都有大约1M个json对象,它们之间用新行分隔(jl格式为jsonlines)。每个json对象在某种程度上都是标准化的信息,但需要通过json加载进行加载,然后在推送到mysql之前将其转换为关系数据库格式。json对象的其他部分将被移动到mongo并为搜索编制索引。