Python 如何加快大文件的文件写入过程?
下面的代码从一个大文本文件中随机抽取若干行,并将原始的大文件分成两部分。它非常慢,在最后一个“for”循环中,将文本写入两个文件。有没有一种方法可以通过使用多处理模块来加快速度?我是新来的Python 如何加快大文件的文件写入过程?,python,multiprocessing,Python,Multiprocessing,下面的代码从一个大文本文件中随机抽取若干行,并将原始的大文件分成两部分。它非常慢,在最后一个“for”循环中,将文本写入两个文件。有没有一种方法可以通过使用多处理模块来加快速度?我是新来的 以open('bigfile.txt','r')作为f\ 打开('split1.txt','w'),作为\ 打开('split2.txt','w')作为b: 所有_行=f.读取行() 尺寸=长度(所有线) 打印(“总尺寸:”,str(尺寸)) 行数=[] 对于范围内的i(尺寸): 行号。追加(i) 随机样本行
以open('bigfile.txt','r')作为f\
打开('split1.txt','w'),作为\
打开('split2.txt','w')作为b:
所有_行=f.读取行()
尺寸=长度(所有线)
打印(“总尺寸:”,str(尺寸))
行数=[]
对于范围内的i(尺寸):
行号。追加(i)
随机样本行数=随机列表(行数,30000)
打印('随机样本大小:',str(len(随机样本行数)))
对于范围内的i(尺寸):
印刷品(一)
如果我使用随机样本线编号:
b、 写入(所有_行[i])
其他:
a、 写入(所有_行[i])
打印(“随机完成!”)
编辑:
def shuffle_list(l, n):
if n>=len(l):
raise ValueError("Invalid randomized number. Out of list index boundary")
shuffle(l)
return l[:n]
这需要几个小时才能将一个文件拆分为大约2000万行。文件的总大小为2.6G。无需将整个输入文件读入内存。你真正需要的就是知道行数。让我们假设您已经知道了这一点,并将其称为
n
。(如果需要,可以在文件的单独过程中计算)。现在,当您阅读输入时,您可以选择写入哪个文件,其概率与您已经选择的随机行数有关
import random
with open('bigfile.txt', 'r') as f, \
open('split1.txt', 'w') as a, \
open('split2.txt', 'w') as b:
# Compute number of lines, if necessary
for size, _ in enumerate(f, start=1):
pass
f.seek(0) # Start over
for line in f:
out = random.choices([a, b], [n, size - n])
if out is a:
n -= 1
size -= 1
out.write(line)
您可以证明,这使每一行被选择为文件a
的概率相同。直观地说,每次你选择一条线,选择后面一条线的概率都会降低,因为可用的空闲“插槽”更少。同时,当您通读该文件时,可能性会增加,因为剩下的插槽中的填充选项越来越少。在极端情况下,当n
达到0时,您将停止拾取行,并且始终拾取一行n==size
如果您对
大小应该是多少有一个粗略的估计,那么您可能可以使用它而不是通过读取整个文件来计算其确切大小,而不会偏离真正的均匀分布。您使用的python版本是什么?您是自己编写的shuffle\u list
还是一个内置的?如果是你写的,你能描述一下它是做什么的,或者把代码贴在这里吗?文件有多大?总尺寸不是线的数量短回答:是的,这可能会加快很多。在b中精确记录30K是很重要的,还是近似数字也会起作用?如果将该变量设置为一个集合而不是一个列表,则随机样本行数中的i
测试会快得多。然而,我不知道你的总时间中有多少是被那个测试占用的。两个问题:选择不是完全随机的(几率取决于行号),如果不严格执行精确计数,则可以避免两次通过。第一个问题:这在数学上相当于统一选择一个固定大小的行子集。较早的线路被选择的概率比较晚的线路小,但这是一个平衡点,因为较晚的线路被考虑的概率较小。我在回答的最后提到了第二个问题。是的。我可以在离线时知道总行号。这看起来也是一个解决更大文件的好办法@切普纳:我错了。我误读了情况,试图解决一个稍微不同的问题。