迭代大行分隔文件而不冻结

时间:2016-08-30 21:02:49

标签: python graph

我试图实现强连接图搜索算法,并尝试将带有图形边缘的大文件加载到内存中。

该文件如下:

  

1 2 //即1到2的有向边缘

     

1 3

     

2 3

     

3 1

     

...

对于算法的这一部分,我需要反转图形,我希望将每个节点与其他一些对算法很重要的值一起存储在字典中。

此代码适用于较小的文件,但只是停止/挂起我的大文件,即72.7mb,我将不胜感激任何使其适用于大文件的建议:

def begin():
    graph = {}
    for line in open('/home/edd91/Documents/SCC.txt'):
        tempArray = []
        for e in line.split():
            if e != ' ' and e!='\n':
                tempArray.append(int(e))            
        if tempArray[1] in graph.keys():
            graph[tempArray[1]]['g'].append(tempArray[0])
        else:
            graph[tempArray[1]] = {'g': [tempArray[0],], 's': False, 't': None, 'u': None }
    print len(graph)

2 个答案:

答案 0 :(得分:1)

如果当然每行都包含一对数字,并且还使用SELECT question_id ,SUM(CASE WHEN is_correct THEN count ELSE 0 END) /(CASE WHEN SUM(count) < 1 THEN 1 ELSE SUM(count) END)::NUMERIC FROM result GROUP BY question_id :tempArray并解压缩来节省一些时间>

defaultdict

答案 1 :(得分:0)

没什么可做的,但由于它有点过于复杂,速度会受到影响。 您可以像这样提高程序速度:

def begin():
    graph = {}
    for line in open('/home/edd91/Documents/SCC.txt'):
        # consider only first 2 fields: avoids the loop and the append: that's the best saver
        # there must not be 2 spaces between the numbers (in your original program neither so not a problem)
        tempArray = line.split()  
        v1 = tempArray[1]  # copy to get rid of array
        if v1 in graph:  # no need to use .keys()
            graph[v1]['g'].append(tempArray[0])
        else:
            graph[v1] = {'g': [tempArray[0],], 's': False, 't': None, 'u': None }
    print len(graph)

您可以先将速度与原始程序与中型文件进行比较。