Python 文件太大,无法读取

Python 文件太大,无法读取,python,file,Python,File,我有一个3,8GB大小的文件“uniprot.tab” 我正试图根据这个文件绘制一个直方图,但它永远无法完成计算,因为它太大了 我以前用一个小文件“mock.tab”测试过我的代码,它工作正常 编辑: 例如,“mock.dat”的一些行: Entry Status Cross-reference (PDB) A1WYA9 reviewed Q6LLK1 reviewed Q1ACM9 reviewed P10994 reviewed 1OY8;1OY9

我有一个3,8GB大小的文件“uniprot.tab”

我正试图根据这个文件绘制一个直方图,但它永远无法完成计算,因为它太大了

我以前用一个小文件“mock.tab”测试过我的代码,它工作正常

编辑: 例如,“mock.dat”的一些行:

Entry   Status  Cross-reference (PDB)
A1WYA9  reviewed    
Q6LLK1  reviewed    
Q1ACM9  reviewed    
P10994  reviewed    1OY8;1OY9;1OY9;1OY9;
Q0HV56  reviewed    
Q2NQJ2  reviewed    
B7HCE7  reviewed    
P0A959  reviewed    4CVQ;
B7HLI3  reviewed    
P31224  reviewed    1IWG;1OY6;1OY8;1OY9;4CVQ;
在这里,您可以看到小文件上使用的代码:

import matplotlib.pyplot as plt

occurrences = []
with open('/home/martina/Documents/webstormProj/unpAnalysis/mock.tab', 'r') as f:
    next(f) #do not read the heading
    for line in f:
        col_third = line.split('\t')[2] #take third column
        occ = col_third.count(';') # count how many times it finds ; in each line
        occurrences.append(occ)

x_min = min(occurrences)
x_max = max(occurrences)


x = [] # x-axis
x = list(range(x_min, x_max + 1))

y = [] # y-axis
for i in x:
    y.append(occurrences.count(i))

plt.bar(x,y,align='center') # draw the plot
plt.xlabel('Bins')
plt.ylabel('Frequency')
plt.show()

我如何才能用我的大文件绘制此图?

不必构建所有值的列表,然后计算每个值的出现次数,而是在迭代时直接构建直方图会快得多。您可以使用
collections.Counter
进行此操作:

from collections import Counter

histogram = Counter()
with open(my_file, 'r') as f:
    next(f)
    for line in file:
        # split line, etc. 
        histogram[occ] += 1

# now histogram is a dictionary containing each "occurrence" value and the count of how many times it was seen.

x_axis = list(range(min(histogram), max(histogram)+1))
y_axis = [histogram[x] for x in x_axis]

尝试使用多处理来计算值,并行处理可能会有所帮助。文件中的典型行有多长?总共有多少行?如果在第一个循环中添加一些输出,您会看到什么?它迭代行的速度有多快?dupe在这里真的适用吗?看起来一次只读取一行文件。。。它已经在或多或少地“延迟”处理它。可能内存不足,因为您正在尝试创建一个包含168321807个条目的列表
事件
。RAM也是我的猜测。列表中的160E6整数在我的机器上需要大约6GB的RAM。按照@tzaman的答案计算直方图箱可能会有所帮助。如果文件行循环仍然很慢,则可能是与I/O有关的任何内容。谢谢,这是一种更干净的绘制直方图的方法,它适用于较小的文件。不幸的是,它没有处理大文件(从未完成计算)。@mb925什么部分需要这么长时间?读取文件,还是创建绘图?请注意,阅读168M行本身可能需要一些时间(可能需要几分钟?@tobias_k是的,几分钟后,它已经计算出了绘图。谢谢