繁体   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