我有一个巨大的Pajek网络文件(大约2GB)和一个具有32GB RAM的Ubuntu虚拟机。在Networkx (read_pajek
)中加载此图形会杀死我的脚本(内存不足被杀死)。该图是加权的和无向的。
我正在尝试开发一个Python脚本,以简化Pajek文件,方法是在将其加载到内存或庞大的字典中。具体来说,该脚本应:
考虑以下Pajek文件的初始示例:
*Vertices 5
1 node1
2 node2
3 node3
4 node4
5 node5
*Edges
1 2 1
1 2 4
2 3 10
5 4 2
4 5 3
3 4 2
3 1 1
文件中的元素由制表符分隔。边缘权重阈值为5,我需要的结果Pajek文件是:
*Vertices 5
1 node1
2 node2
3 node3
4 node4
5 node5
*Edges
1 2 5
2 3 10
5 4 5
您能帮我找到一种在合理的时间内有效完成此操作的方法吗?
更新
到目前为止,我所能做的最好的就是这段代码,但是它仍然在内存中加载边缘:
import re
with open('output.net', 'w', encoding = 'utf-8') as outfile:
with open('input.net', encoding = 'utf-8') as input_data:
for line in input_data:
outfile.write(line)
if line.strip() == '*Edges' or line.strip() == '*Arcs':
break
explored = {}
for line in input_data:
SoTaWe= re.split(r'\t+', line.rstrip('\t\n'))
SoTa = '\t'.join(sorted(SoTaWe[:-1]))
try:
explored[SoTa] += float(SoTaWe[2])
except:
explored[SoTa] = float(SoTaWe[2])
for k,v in explored.items():
if v > 4:
riga = k + "\t" + str(v) + '\n'
outfile.write(riga)
outfile.close()
有什么更好的吗?