python - 如何检查倒序字符串元组并从python中的大文本文件(> 60GB)文件中消除它们?
问题描述
我有以下代码来查找逆序字符串元组并从文本文件中消除它们。但是对于大型文本文件(> 60GB)并且我的系统崩溃需要无限的时间。
with open("OUTPUT.txt.txt", "w") as output:
for fileName in ["Large_INPUT.txt"]:
found_combinations = set()
with open(fileName, 'r') as file1:
for line in file1:
cols = [col.strip() for col in line.strip().split('\t')]
new_combination = frozenset(cols)
if new_combination not in found_combinations:
found_combinations.add(new_combination)
out = ', '.join(cols) + '\n'
output.write(out)
例如,如果输入是:
352_0F, 352_1F, 0.913
352_1F, 352_0F, 0.913
预期的输出是:
352_0F, 352_1F, 0.913
有没有办法针对大文件优化此代码?
解决方案
对于程序崩溃,我怀疑您的设备正在破坏其最大容量。对于 22 个字符行,一个 65GB 的文件将在集合中生成近 30 亿个条目(假设您没有很大比例的重复行)。这根本不适合 32 位系统(因此请确保您运行的是 64 位并具有大量内存)
对于性能,您应该检查进程是否受 CPU 限制或 I/O 限制。即使不进行任何处理,一次读取一行一行的大文件也可能需要很长时间。取一个不会导致程序崩溃(或为了测试而减少一个文件)的文件,并测量简单地输入一个文件并输出相同文件(没有任何过滤)所花费的时间。这将是您可以通过逐行处理获得的最短时间。如果这接近过滤所需的时间,那么您有 I/O 问题。确保您使用 SSD 存储将是第一步。您也可以尝试这里提出的解决方案(尽管我不确定它是否适用于您的环境):https ://stackoverflow.com/a/60571361/5237560
由于列表中只有 3 个值,因此可以使用字典将集合分解为更小的对象。假设元组反转只发生在前两个值之间,您可以按第三个值对集合进行分组。这会限制设置的大小(假设您有各种各样的这些值)
例如:
from collections import defaultdict
...
for line in file1:
seenTuples = defaultdict(set)
code1,code2,value = [col.strip() for col in line.strip().split('\t')]
if code1>code2 : code1,code2 = code2,code1
if (code,code2) in seenTuples[value]: continue # skip this line
seenTuples[value].add((code1,code2))
output.write(line)
推荐阅读
- flutter - Flutter 自定义 UI 可滚动
- ffmpeg - ffmpeg:在不改变实际宽度和高度的情况下缩放视频
- python - 在 PyQtGraph 和 PySide2 中使用 ImageView 修复文本位置
- networking - 子网 - 网络
- spartacus-storefront - 如何更改 Spartacus 中的页面布局?
- r - 数据帧上的反向对数转换
- android - 获取设备位置在我的代码中不起作用?
- javascript - 如何从数据库中获取然后渲染反应组件?
- python - 在 Paramiko 中仅记录 SSH 身份验证横幅
- python-3.x - 如何计算视频中物体行进的距离?