簡體   English   中英

如何讀取數據對應於python中60GB文本文件中的特定行號?

[英]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.

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