我有一个大型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中的选项,但在循环中从硬盘驱动器读取时也不会过长?
答案 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()