![](/img/trans.png)
[英]How to remove all lines from a large text file (>60GB) that contains a specific alphabet in python?
[英]How to read data corresponds to specific line numbers from a 60GB text file in python?
我有一個60GB大小的文本文件(10億行)。 我必須提取對應於指定行號的數據,這些行號可以從另一個文本文件中讀取(例如:1,4,70,100 ......等)。 由於大小我無法將數據加載到內存然后提取行。 此外,逐行匹配和提取將花費許多天的時間。 這個問題有解決方案嗎?
我試過的兩種方法:
第一種方法
f = open('line_numbers.txt')
lines = f.readlines()
numbers =[int(e.strip()) for e in lines]
r = max(numbers)
file = open('OUTPUT_RESULT.txt','w')
with open('Large_File.txt') as infile:
for num, line in enumerate(infile,1):
if (num<= r):
if (num in numbers):
file.write(line)
else:
pass
print(num)
獲得結果需要很多天
2.第二種方法
import pandas as pd
data = pd.read_csv('Large_File.txt', header=None)
file = open('OUTPUT_RESULT.txt','w')
f = open('line_numbers.txt')
lines = f.readlines()
numbers =[int(e.strip()) for e in lines]
x = data.loc[numbers,:]
file.write(x)
它不會將文件加載到內存中
有沒有解決方案可以解決這個問題?
您的問題可能是if (num in numbers)
行。 它不僅不需要括號,而且每次迭代都會檢查它,即使您的代碼按順序遍歷文件(第1行,第2行,等等)。
這可以很容易地進行優化並且這樣做,下面的代碼在大約5000萬行的測試文件上僅運行12秒。 它應該在幾分鍾內處理您的文件。
import random
numbers = sorted([random.randint(1, 50000000) for _ in range(1000)])
outfile = open('specific_lines.txt', 'w')
with open('archive_list.txt', 'r', encoding='cp437') as infile:
for num, line in enumerate(infile, 1):
if numbers:
if num == numbers[0]:
outfile.write(line)
print(num)
del numbers[0]
else:
pass
注意:這會生成1,000個隨機行號,替換為您的示例中加載的數字。 如果您的數字列表要大得多,則輸出文件的寫入時間會稍微增加執行時間。
你的代碼就像:
with open('line_numbers.txt') as f:
lines = f.readlines()
numbers = sorted([int(e.strip()) for e in lines])
outfile = open('specific_lines.txt', 'w')
with open('archive_list.txt', 'r', encoding='cp437') as infile:
for num, line in enumerate(infile, 1):
if numbers:
if num == numbers[0]:
outfile.write(line)
print(num)
del numbers[0]
else:
pass
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.