+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何检查颠倒顺序的字符串元组,并从python中的大文本文件(> 60GB)文件中消除它们?

发布于2021-01-17 16:25     阅读(544)     评论(0)     点赞(20)     收藏(2)


0

1

2

3

4

5

6

7

8

9

我有以下代码来查找反序字符串元组并将其从文本文件中消除。但是大型文本文件(> 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)

0

1

2

3

4

5



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/777232/67d85a8430a5dd25efa4/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)