在非常大的csv文件中优化搜索

2024-04-20 11:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个只有一列的csv文件,但是有620万行,所有的行都包含6到20个字母之间的字符串。有些字符串会在重复的(或更多)条目中找到,我想把它们写到一个新的csv文件中——估计应该有大约100万个非唯一字符串。就这样,真的。然而,在一本包含600万条词条的词典中不断搜索确实需要时间,如果有任何提示,我将不胜感激。到目前为止,我写的任何剧本至少需要一周时间(!)跑,根据我做的一些计时。在

第一次尝试:

in_file_1 = open('UniProt Trypsinome (full).csv','r')
in_list_1 = list(csv.reader(in_file_1))
out_file_1 = open('UniProt Non-Unique Reference Trypsinome.csv','w+')
out_file_2 = open('UniProt Unique Trypsin Peptides.csv','w+')
writer_1 = csv.writer(out_file_1)
writer_2 = csv.writer(out_file_2)

# Create trypsinome dictionary construct
ref_dict = {}
for row in range(len(in_list_1)):
    ref_dict[row] = in_list_1[row]

# Find unique/non-unique peptides from trypsinome
Peptide_list = []
Uniques = []
for n in range(len(in_list_1)):
    Peptide = ref_dict.pop(n)
    if Peptide in ref_dict.values(): # Non-unique peptides
        Peptide_list.append(Peptide)
    else:
        Uniques.append(Peptide) # Unique peptides

for m in range(len(Peptide_list)):
    Write_list = (str(Peptide_list[m]).replace("'","").replace("[",'').replace("]",''),'')
    writer_1.writerow(Write_list)

第二次尝试:

^{pr2}$

编辑:以下是csv文件中的几行:

SELVQK
AKLAEQAER
AKLAEQAERR
LAEQAER
LAEQAERYDDMAAAMK
LAEQAERYDDMAAAMKK
MTMDKSELVQK
YDDMAAAMKAVTEQGHELSNEER
YDDMAAAMKAVTEQGHELSNEERR

Tags: 文件csv字符串inrefforopenout
3条回答

我对Python不是很在行,所以我不知道“in”是如何工作的,但是您的算法似乎是在n²中运行的。 试着在阅读完你的列表后对它进行排序,在n log(n)中使用一个algo,比如quicksort,它应该能更好地工作。 一旦列表被排序,您只需检查列表中两个连续的元素是否相同。在

所以你得到的读数是n,排序是n log(n)(最多),比较是n

第一个提示:Python支持延迟求值,最好在处理大型数据集时使用它。所以:

  • 在csv.reader与其建立一个庞大的内存列表
  • 不要用范围来构建庞大的内存列表-如果您同时需要项和索引,请使用^{},如果不需要索引,只需迭代序列中的项。在

第二个提示:使用dict(hashtable)的要点是查找,而不是值。。。所以不要建立一个庞大的dict作为一个列表。在

第三个提示:如果您只想用一种方法来存储“已经看到”的值,请使用^{}。在

和纽比一起做吧。大致:

import numpy as np
column = 42
mat = np.loadtxt("thefile", dtype=[TODO])
uniq = set(np.unique(mat[:,column]))
for row in mat:
    if row[column] not in uniq:
        print row

您甚至可以使用numpy.savetxt和char数组运算符对output stage进行矢量化,但这可能不会有太大的区别。在

相关问题 更多 >