gpt4 book ai didi

python - 比较两个大的 csv 文件并用 python 编写另一个

转载 作者:行者123 更新时间:2023-11-28 16:26:47 25 4
gpt4 key购买 nike

我正在尝试比较两个包含化学品数据的大型 csv 文件。

第一个,“file1”是 14 Mb(不算重),第二个,“file2”是 3Go(47798771 行)。

这里是文件 1 的示例(我们将关注第四列,其中包含 inchikeys):

MFCD00134034    7440-42-8   B   UORVGPXVDQYIDP-UHFFFAOYSA-N
MFCD01745487 64719-89-7 B1BBBB(BBBBB1[Li])[Li] XZXJQLAKEUKXOT-UHFFFAOYSA-N
MFCD01310566 19287-45-7 BB QSJRRLWJRLPVID-UHFFFAOYSA-N
MFCD00011323 10035-10-6 Br CPELXLSAUQHCOX-UHFFFAOYSA-N
N(CCNCCCCCCCCCCNCCN(CC)CC)(CC)CC PISAWRHWZGEVPP-UHFFFAOYSA-N
MFCD01744969 137638-86-9 O(C(=O)C(c1ccccc1)c1ccccc1)c1cc2c(C[C@H]3N(CC[C@]2(C)C3C)Cc2ccccc2)cc1 CIRJJEXKLBHURV-MAYWEXTGSA-N
O(CCCN1CCCC1)c1ccc(NC(=Nc2ccccc2)c2ccccc2)cc1 KETUBKLQEXFJBX-UHFFFAOYSA-N
MFCD01694581 3810-31-9 S(CCN(CCSC(N)=N)CCSC(N)=N)C(N)=N GGDUORJVTMUGNU-UHFFFAOYSA-N
MFCD06794992 60066-94-6 Brc1cc(C(=O)c2ncccc2)c(NC(=O)CNC(=O)[C@@H](N)CCCCN)cc1 NVOGGKXDMDDFEG-HNNXBMFYSA-N
MFCD06794980 60066-98-0 Brc1cc(C(=O)c2ncccc2)c(NC(=O)CNC(=O)[C@@H](N)CCCNC(N)=N)cc1 LFCYDGUHINTBOJ-AWEZNQCLSA-N

文件 2:

lat_chemical_id stereo_chemical_id  source_cid  inchikey
CID100000001 CID000000001 1 RDHQFKQIGNGIED-UHFFFAOYSA-N
CID100000010 CID000000010 10 AUFGTPPARQZWDO-UHFFFAOYSA-N
CID100000100 CID000000100 100 UTIBHEBNILDQKX-UHFFFAOYSA-N
CID100001000 CID000001000 1000 ULSIYEODSMZIPX-UHFFFAOYSA-N
CID100010000 CID000010000 10000 ZPIFKCVYZBVZIV-UHFFFAOYSA-N
CID100100000 CID000100000 100000 SPTBIJLJJBZGDY-UHFFFAOYSA-N
CID101000000 CID001000000 1000000 XTNVYACQOFUTNH-UHFFFAOYSA-N
CID110000000 CID010000000 10000000 WUGPGGSZFRVGGA-UHFFFAOYSA-N
CID110000001 CID010000001 10000001 ANOUMYXLUIDQNL-UHFFFAOYSA-N

我的目标是比较两个文件中第四行的 inchikeys,看看它们是否相同。然后在这种情况下,提取所有信息(从两个文件中)并将它们写在第三个文件中。

这是我的(天真的)代码:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
######################
import numpy as np
import argparse
import csv
#################################


def compare(tab_data_inchik,stitch,output):
dt = open(tab_data_inchik, 'rb')
st = open(stitch,'rb')
out = open(output,'wb')
data = csv.reader(dt, delimiter = '\t')
database = csv.reader(st, delimiter = '\t')
result = csv.writer(out, delimiter = '\t')
for line in data:
for row in database:
if line[3] == row[3]:
result.writerow((line[0],line[1],line[2],row[0],row[1],row[2],row[3]))

dt.close()
st.close()
out.close()

##############################""
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("tsv1", help = "Pr Data")
parser.add_argument("tsv2", help = "Database")
parser.add_argument("output", help = "output file")
args=parser.parse_args()

compare(args.tsv1,args.tsv2,args.output)

看起来,程序甚至没有到达数据库循环的第二行,我猜是因为文件太大而且我的方法是机器人优化的。也许我应该使用 numpy.where() 但我不知道如何使用。

有没有不用双循环获取信息的方法?提前致谢。

最佳答案

哪里出了问题:
在您的代码中,您正在循环数百万行,在 3GB 文档中包含超过 44000000 行假设每行平均字符为 68 个字符,假设在 14MB 文档中有超过 205000 行。
那么第20行会被执行44000000 * 205000 = 9.02*10^12次。

if line[3] == row[3]:

单 CPU 上的普通计算机每秒只能运行 10^10 条低级指令,而一行 python 代码通常需要比单条指令多得多的执行时间。因为 CPU 需要大量时间才能完成它

Python 字典数据结构(哈希表):
集合是一种数据结构,它可以在恒定数量的小型 CPU 指令中有效地检查单个数据之前是否存储在其中(非常节省时间)。

如果你使用这样的东西,在普通的 Intel Core i5 或类似的东西上完成不到 5 分钟。

database_set = dict()
for row in database: #Loop on the smaller file so we store less in memory.
database_set[row[3]] = (row[0],row[1],row[2])
for line in data:
if line[3] in database_set:
row = database_set[line[3]]

result.writerow((line[0],line[1],line[2],row[0],row[1],row[2],line[3]))

如果您想了解如何使用 python 集,请查找 here
如果你想知道 set 是如何工作的,你可以找到 here

关于python - 比较两个大的 csv 文件并用 python 编写另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35990326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com