我有一个相当大的文件(300 万行),每一行都是人与事件的关系。最终,我想将此二分网络投影到单模加权网络上,并将其写入 CSV 文件。我正在使用 NetworkX,并且我在一个小得多的示例数据集上测试了我的代码,并且它可以正常工作。然而,当我扩大到我的实际数据集时,我的计算机只是最大限度地利用内存并旋转和旋转,但没有取得任何进展。
我正在使用具有 32GB 内存的 AWS EC2 机器。
经过一些示例测试后,我很确定在投影图表后的最后一步中事情会被挂起,并且它正在被写入 CSV 文件。我尝试将文件分解成块,但是我遇到了缺少边缘或正确地将边缘权重添加在一起的问题。但我认为更好的解决方案是找到一种方法来加快将投影图写入 CSV 的速度。
有关原始数据的更多信息:一些活动只有 1 人参加,而其他活动有 5,000 人参加。正因为如此,当二分网络折叠到单模网络上时,会产生大量的边(我预测约为 50M)。
使用 NetworkX 来投影二分网络并写入 CSV 的代码
# import modules
import time
import csv
import networkx as nx
from networkx.algorithms import bipartite
startTime = datetime.datetime.now()
# rename files
infile = 'bipartite_network.csv'
name_outfile = infile.replace('.csv', '_nameFolded.csv.')
print 'Files renamed at: ' + str(datetime.datetime.now() - startTime)
# load CSV into a dict
with open(infile, 'rb') as csv_file:
rawData = list(csv.DictReader(csv_file))
print 'Files loaded at: ' + str(datetime.datetime.now() - startTime)
# create edgelist for Name -x- Event relationships
edgelist = []
for i in rawData:
edgelist.append(
(i['Event'],
i['Name'])
)
print 'Bipartite edgelist created at: ' + str(datetime.datetime.now() - startTime)
# deduplicate edgelist
edgelist = sorted(set(edgelist))
print 'Bipartite edgelist deduplicated at: ' + str(datetime.datetime.now() - startTime)
# create a unique list of Name and Event for nodes
Event = sorted(set([i['Event'] for i in rawData]))
Name = sorted(set([i['Name'] for i in rawData]))
print 'Node entities deduplicated at: ' + str(datetime.datetime.now() - startTime)
# add nodes and edges to a graph
B = nx.Graph()
B.add_nodes_from(Event, bipartite=0)
B.add_nodes_from(Name, bipartite=1)
B.add_edges_from(edgelist)
print 'Bipartite graph created at: ' + str(datetime.datetime.now() - startTime)
# create bipartite projection graph
name_nodes, event_nodes = bipartite.sets(B)
event_nodes = set(n for n,d in B.nodes(data=True) if d['bipartite']==0)
name_nodes = set(B) - event_nodes
name_graph = bipartite.weighted_projected_graph(B, name_nodes)
print 'Single-mode projected graph created at: ' + str(datetime.datetime.now() - startTime)
# write graph to CSV
nx.write_weighted_edgelist(name_graph, name_outfile, delimiter=',')
print 'Single-mode weighted edgelist to CSV: ' + str(datetime.datetime.now() - startTime)
endTime = datetime.datetime.now()
print 'Run time: ' + str(endTime - startTime)
使用 Pandas 编写投影边缘列表,但缺少边缘权重?
我考虑过使用pandas
写入name_graph
CSV。这是加快写入 CSV 部分过程的好选择吗?
import pandas as pd
df = pd.DataFrame(name_graph.edges(data=True))
df.to_csv('foldedNetwork.csv')