gpt4 book ai didi

python - 如何加快大文件的写入速度?

转载 作者:行者123 更新时间:2023-12-02 07:26:21 27 4
gpt4 key购买 nike

以下代码从大文本文件中获取随机数量的行,并将原始大文件分成两部分。在最后一个“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 时,您将始终选取一行。

如果您对大小应该有一个粗略的估计,您可能可以使用它而不是阅读整个文件来计算其确切大小,而不会偏离真正的均匀分布太多.

关于python - 如何加快大文件的写入速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com