使用python,我应该在数组中缓存大数据并一次性写入文件吗?

2024-04-18 16:36:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个gevent驱动的爬虫下载页面。爬虫程序采用producer-consumer模式,我向队列提供如下数据{方法:获取, 网址:xxxx,其他_信息:yyyy}. 在

现在我想把一些响应汇编成文件。问题是,我不能只在每次请求结束时打开和写入,io代价高昂,数据顺序不正确。在

我假设我应该对所有请求进行编号,按顺序缓存响应,打开一个greenlet循环并汇编文件,伪代码可能是这样的:

max_chunk=1000
data=[]
def wait_and_assemble_file(): # a loop
    while True:
        if len(data)==28:
            f= open('test.txt','a')
            for d in data:
                f.write(d)
            f.close()
        gevent.sleep(0)

def after_request(response, index): # Execute after every request ends
    data[index]=response  # every response is about 5-25k

有更好的解决办法吗?有数千个并发请求,我怀疑内存使用可能增长太快,或者一次循环太多,或者意外的事情。在

更新:

上面的代码只是演示了数据缓存和文件写入的原理。在实际情况下,可能需要运行100次循环来等待缓存完成并写入不同的文件。在

更新2

@IT Ninja建议使用队列系统,所以我用Redis写了一个替代方案:

^{pr2}$

看起来好一点,但我怀疑在Redis中保存大量数据是不是一个好主意,希望有更多的建议!在


Tags: 文件数据代码dataindex队列顺序response
2条回答

这取决于数据的大小。如果它非常大,它可以减慢所有结构在内存中的程序。在

如果内存不是问题,您应该将结构保存在内存中,而不是一直从文件中读取。用concurrents请求反复打开文件不是一个好的解决方案。在

使用队列系统处理类似的问题可能会更好,而不是每个线程都有自己的文件处理程序。这是因为每个线程都有自己的处理程序,所以在编写此文件时可能会遇到竞争条件。在

就资源而言,假设传递到文件的信息不是非常大(Python在这方面很好),那么除了磁盘写入之外,这不应该占用太多的资源。如果这确实带来了问题,那么将文件分块读入内存(并按比例写入块)可以大大减少这个问题,只要这是文件上载的一个选项。在

相关问题 更多 >