python-简化大型Pajek .net文件

时间:2018-10-29 09:49:50

标签: python bigdata pajek

我有一个巨大的Pajek网络文件(大约2GB)和一个具有32GB RAM的Ubuntu虚拟机。在Networkx read_pajek中加载此图形会杀死我的脚本(内存不足被杀死)。该图是加权的和无向的。

我正在尝试开发一个Python脚本,以简化Pajek文件,方法是在将其加载到内存或庞大的字典中。具体来说,该脚本应:

  1. 删除多行并对其值求和;
  2. 然后,删除权重低于阈值的边缘。方向并不重要。

考虑以下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()

有什么更好的吗?

0 个答案:

没有答案