У меня есть огромный сетевой файл Pajek (около 2 ГБ) и виртуальная машина Ubuntu с 32 ГБ ОЗУ. Загрузка этого графика в 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
Можете ли вы помочь мне найти способ сделать это эффективно и в разумные сроки?
UPDATE
Пока лучшее, что я мог сделать, - это код, который, тем не менее, загружает ребра в память:
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()
Что-нибудь лучше?