在csv中找到互惠对

时间:2014-03-11 00:01:40

标签: python bigdata networkx

我有一个大型csv文件(~250M行),结构如下

ID1, ID2, value
A, B, 5
B,C, 8
C,B, 4

我想得到一张表,告诉我该对(ID1,ID2)是否在文件中被回复。所以输出应该是这样的:

ID1, ID2, Reciprocity
A,B,0
B,C,1
C,B,1

我会通过创建一个字典并检查密钥ID2 + ID1是否在字典中,但字典变得比我的RAM大。我尝试过使用networkx但是无法创建图表,因为我的RAM也用完了。

什么是不需要将整个文件加载到RAM中的选项,但在循环中从硬盘驱动器读取时也不会过长?

3 个答案:

答案 0 :(得分:1)

最好和最具可扩展性的解决方案可能是import the CSV into an SQLite database。然后为“Reciprocity”创建一个新表,并从那里找到遵循这个近似伪代码的所有潜在对:

Load CSV into a database with Table DATA
Create RECIPROCITY Table with columns ID1,ID2,Reciprocal
Iterate through each row R in DATA:
    Let A,B = DATA.ID1, DATA.ID2
    Search RECIPROCITY for A,B
      If A,B doesnt exist add a new row
    Search RECIPROCITY for B,A
      If B,A exists update add update RECIPROCITY.Reciprocal for A,B and B,A

答案 1 :(得分:1)

您使用的是UNIX-ish操作系统吗? 这是一种列出“互惠对”的方法:

$ cat data.txt
A,B, 5
B,C, 8
C,B, 4
$ cat data.txt |awk -F',' '{ if ($1<$2) print $1" "$2; else print $2" "$1}' | sort |uniq -c | awk '$1>1 {print $2" "$3}'
B C

答案 2 :(得分:0)

尝试使用shelve

import shelve

pairs = shelve.open('myshelf')

with open('data', 'r') as f:
    for line in f:
        id1, id2, value = [s.strip() for s in line.split(',')]
        pairs[id1 + id2] = True

with open('processed', 'w') as f:
    for (id1, id2) in pairs:
        if id2 + id1 in pairs:
            f.write('%s, %s, 1\n' % (id1, id2))
        else:
            f.write('%s, %s, 0\n' % (id1, id2))

pairs.close()