我有一段代码,可以逐行读取和处理文本文件,问题是我的文本文件有15-20亿行,而且要花很长时间。是否可以同时处理超过1亿条生产线
from cryptotools.BTC.HD import check, WORDS
with open("input.txt", "r") as a_file:
for line in a_file:
stripped_line = line.strip()
for word in WORDS:
mnemonic = stripped_line.format(x=word)
if check(mnemonic):
print(mnemonic)
with open("print.txt", "a") as i:
i.write(mnemonic)
i.write("\n")
输入文件具有以下采样行:
gloom document {x} stomach uncover peasant sock minor decide special roast rural
happy seven {x} gown rally tennis yard patrol confirm actress pledge luggage
tattoo time {x} other horn motor symbol dice update outer fiction sign
govern wire {x} pill valid matter tomato scheme girl garbage action pulp
要一次处理1亿行,必须有1亿个线程。另一种提高代码速度的方法是在不同的线程之间分配工作(少于1亿个线程)。
由于文件的写入和读取操作不是异步的,所以最好在程序开始时读取所有文件,并在程序结束时写出处理过的数据。在下面的代码中,我假设您不关心写入文件的顺序。但是,如果顺序很重要,您可以设置一个字典,该字典以特定线程所阐述的当前行的位置值为键,并在末尾进行相应的排序。
更改您认为最有效的线程数
编辑(使用内存优化):
上面的代码虽然非常快,但占用了大量内存,因为它将整个文件加载到内存中,然后再对其进行处理。
然后您有两个选项:
下面的代码从文件中读取一行(一行有1000万行,约为~500 MB),然后将该数据发送给管理固定数量线程的类。目前,每当一个线程完成时,我都会生成一个新线程,事实上,这样会更有效,始终使用相同的线程,并为每个线程使用一个队列。然后我生成一个
writer
线程,它唯一的工作就是写入将包含结果的out.txt
文件。在我的测试中,我只读取文本文件,并在另一个文件中写入相同的行我发现如下(使用1000万行文件):
两个程序使用相同数量的线程获得计时结果
从这些结果可以明显看出,内存优化的代码在使用更少ram的情况下运行速度明显较慢。您可以调整内部参数,如线程数或最大队列大小,以提高性能,同时要记住这会影响内存使用。经过大量测试后,我建议将文件拆分为多个子文件,这些子文件可以放在内存中,并运行原始版本的代码(见上文),因为在我看来,时间和速度之间的权衡是不合理的
在这里,我将针对内存消耗优化的代码放入中,但要记住,没有以任何重要方式进行优化。就线程管理而言,建议始终使用相同的线程,并使用多个队列将数据传递给这些线程
在这里,我留下了我用来优化内存消耗的代码(是的,比上面XD的代码要复杂得多,可能比它需要的还要复杂):
您可以暂时删除打印,我留下这些只是为了参考,以了解我如何计算程序运行所需的时间,下面您可以从task manager中找到两个程序执行的屏幕截图
内存优化版本:
原始版本(截图时我忘了展开终端进程,不管怎样,备忘录y终端子进程的使用相对于程序使用的子进程是可以忽略的,并且1.3 GB的ram是准确的):
相关问题 更多 >
编程相关推荐