簡體   English   中英

如何檢查逆序字符串元組並從python中的大文本文件(> 60GB)文件中消除它們?

[英]How to check for reversed order string tuple and eliminate them from a large text file (>60GB) file in python?

我有以下代碼來查找逆序字符串元組並將它們從文本文件中刪除。 但是大文本文件(> 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM