我创建了一个每行读取文件行的脚本,但是我有一个大文件(32GB),因此需要很长时间才能完成。
这里是多处理的地方,为了加快速度,但是我不太了解这个read_in_chunks
函数,有人可以帮助我吗?
这是脚本:
def read_in_chunks(file_object, chunk_size=1024):
"""Lazy function (generator) to read a file piece by piece.
Default chunk size: 1k."""
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
f = open('teste.txt')
for piece in read_in_chunks(f):
print piece
谢谢大家。
更新抱歉,我忘了说我将在MySQL DB中插入的行
答案 0 :(得分:3)
read_in_chunks
是一个在文件中返回一些字节数chunk_size
的函数。 read_in_chinks
是一个生成器并使用yield
运算符,以便在需要这些块之前不会将这些块存储到计算机的内存中。
你说你的脚本是“逐行”的,从技术上来说它是“chunk”的'chunk'。这种区别可能看起来很迂腐,但重要的是要注意。
并行读取文件不会给你带来任何性能提升。 (假设计算机设置正常)物理硬盘驱动器只有一个读写头,因此头部无法同时在两个位置读取文件的两个部分。 想象一下,你的眼球试图在同一时间同时从两页读取。不会发生。 因此,读取文件称为输入/输出绑定(I / O界限), 更多进程无法加速读取文件。
但是, 更多进程可以帮助您加快对从文件中读取的数据的处理速度。
现在,您对从文件中读取的数据运行的操作称为print
。如果要在代码中添加多处理元素,则会发生这种情况。
您的主要流程将读取几个数据块。然后每个块将被传递到一个单独的进程,然后每个进程将打印该块。
显然,打印不是一个CPU密集型操作,因此考虑到产生新进程的开销,以这种方式进行多处理是没用的,并且会造成更多的损害而不是好处。
但是,如果对数据的操作是cpu密集型的,例如采用一串文本并计算其Weissman分数的复杂算法,则多处理将是有益的。
主要流程会读取大量数据块,并将每个块传递给单独的进程。每个过程都会计算数据的Weismann分数,然后将该信息返回给主过程。
这是一些伪代码:
def calc_weissman_score(chunk_of_data):
# a bunch of cpu intensive stuff here that take a lot of time
print 42
f = open('teste.txt')
gigabyte = 1000000000
process_pool = 5 processes # use multiprocessing module for this
for piece in read_in_chunks(f, chunk_size=gigabyte):
if there are not processes in the process pool:
wait until there are processes in the process pool
spawn a new process that calls calc_weissman_score(piece)
简而言之,多处理不会帮助您从文件中读取数据,但它可能会加快处理数据所需的时间。
答案 1 :(得分:0)
您的read_in_chunks
函数只为您提供了一个生成器对象,该对象按块读取文件块。并行没有任何进展,你不会看到任何加速。
事实上,并行读取文件不太可能带来任何加速。在非常基本的硬件级别考虑它:您只能在任何给定时刻从硬盘驱动器上的一个位置读取数据。顺序读取文件的速度与任何并行尝试一样快。
我认为this answer提供了一个很好的整体图片,可以帮助您处理大文件。