1

我有一个单列的 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)

第二次尝试:

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+')
writer_1 = csv.writer(out_file_1)

ref_dict = {}
for row in range(len(in_list_1)):
    Peptide = in_list_1[row]
    if Peptide in ref_dict.values():
        write = (in_list_1[row],'')
        writer_1.writerow(write)
    else:
        ref_dict[row] = in_list_1[row]

编辑:这是 csv 文件中的几行:

SELVQK
AKLAEQAER
AKLAEQAERR
LAEQAER
LAEQAERYDDMAAAMK
LAEQAERYDDMAAAMKK
MTMDKSELVQK
YDDMAAAMKAVTEQGHELSNEER
YDDMAAAMKAVTEQGHELSNEERR
4

4 回答 4

3

用 Numpy 来做。大致:

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.savetxtchar-array 运算符对输出级进行矢量化处理,但这可能不会有太大的不同。

于 2013-10-07T12:43:27.107 回答
2

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

  • 迭代你的 csv.reader 而不是构建一个巨大的内存列表,
  • 不要使用范围构建巨大的内存列表 -enumerate(seq)如果您需要项目和索引,请使用,如果不需要索引,只需迭代序列的项目。

第二个提示:使用dict(哈希表)的主要目的是查找,而不是值......所以不要构建一个用作列表的巨大字典。

第三个提示:如果您只是想要一种存储“已经看到”值的方法,请使用Set.

于 2013-10-07T12:36:18.713 回答
0

我在 Python 中不太好,所以我不知道“in”是如何工作的,但你的算法似乎在 n² 中运行。尝试在阅读列表后对其进行排序,使用 n log(n) 中的算法,如快速排序,它应该会更好。列表排序后,您只需检查列表的两个连续元素是否相同。

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

于 2013-10-07T12:37:00.223 回答
0

尽管我认为 numpy 解决方案是最好的,但我很好奇我们是否可以加快给定示例的速度。我的建议是:

  • 跳过 csv.reader 费用,只需阅读该行
  • rb 跳过修复换行符所需的额外扫描
  • 使用更大的文件缓冲区大小(读​​取 1Meg,写入 64K 可能很好)
  • 使用 dict 键作为索引 - 键查找比值查找快得多

我不是一个麻木的人,所以我会做类似的事情

in_file_1 = open('UniProt Trypsinome (full).csv','rb', 1048576)
out_file_1 = open('UniProt Non-Unique Reference Trypsinome.csv','w+', 65536)

ref_dict = {}
for line in in_file_1:
    peptide = line.rstrip()
    if peptide in ref_dict:
        out_file_1.write(peptide + '\n')
    else:
        ref_dict[peptide] = None
于 2013-10-07T15:53:23.597 回答