如何加快大文件的文件写入过程?



以下代码从一个大文本文件中随机获取行数,并将原始大文件分成两部分。在最后一个"for"循环中,将文本写入两个文件非常非常慢。有没有办法通过使用多处理模块使其更快?我是新手。

with open('bigfile.txt', 'r') as f, 
open('split1.txt', 'w') as a, 
open('split2.txt', 'w') as b:
all_lines = f.readlines()
size = len(all_lines)
print("total size: ", str(size))
line_numbers = []
for i in range(size):
line_numbers.append(i)
random_sample_line_numbers = shuffle_list(line_numbers, 30000)
print('Random sample size: ', str(len(random_sample_line_numbers)))
for i in range(size):
print(i)
if i in random_sample_line_numbers:
b.write(all_lines[i])
else:
a.write(all_lines[i])
print("Randomize done!")

编辑:

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一次选择一条线。

如果你对size应该是什么有一个粗略的估计,你可能会使用它,而不是通读整个文件来计算它的确切大小,而不会偏离真正的均匀分布太多。

相关内容

  • 没有找到相关文章