编辑:最初我试图做到一般,但结果模糊不清。我在下面列出了更多细节。
我正在编写一个脚本,从两个大型CSV文件中提取数据,其中一个是人们的日程安排,另一个是关于他们日程安排的信息。数据被挖掘并组合以最终创建人们连接的星期一至星期六的pajek格式图,第七个图表示一周中所有连接,其中包含1和0的字符串,以指示连接的星期几。最后一个图表是pajek格式的中断,由另一位研究人员编写的单独程序使用。
Pajek格式有一个大的标题,然后将连接列为(vertex1 vertex2)无序对。将这些对存储在字典中很困难,因为两对之间通常在同一天存在多个连接。
我想知道输出到这些图表的最佳方式是什么。我应该制作大型单个图并让第二个脚本将其解构为几个较小的图形吗?我应该保持七个流打开并且当我确定连接写入它们时,或者我应该为每个流保留一些其他数据结构并在可能时输出它们(如队列)?
答案 0 :(得分:2)
我会打开七个文件流,因为如果有很多数据,累积它们可能会非常大。当然,如果您可以对它们进行实时排序,并且首先不需要读取所有数据来进行排序,那么这只是一个选项。
答案 1 :(得分:2)
“...从两个大型CSV文件中提取数据,其中一个是人们的日程安排,另一个是关于他们日程安排的信息。”模糊,但我想我明白了。
“数据被挖掘并组合起来,最终为周一至周六的人们连接创建pajek格式图,”已开采和合并。凉。哪里?在这个脚本?在另一个应用?通过一些第三方模块?通过一些网络服务?
这是一次一行的算法吗?一行输入是否产生一个连接,该连接被发送到一个或多个每日图表?
这是一种算法,它必须先查看整个计划才能生成任何内容吗? [如果是这样,那可能是错的,但我真的不知道,你的问题在这个中心细节上非常模糊。]
“......第七个图表,表示一周中所有连接,其中包含1和0的字符串,表示连接的星期几。”不完整,但可能已经足够好了。
def makeKey2( row2 ):
return ( row2[1], row2[2] ) # Whatever the lookup key is for source2
def makeKey1( row1 ):
return ( row1[3], row1[0] ) # Whatever the lookup key is for source1
dayFile = [ open("day%d.pajek","w") for i in range(6) ]
combined = open("combined.dat","w")
source1 = open( schedules, "r" )
rdr1= csv.reader( source1 )
source2 = open( aboutSchedules, "r" )
rdr2= csv.reader( source2 )
# "Combine" usually means a relational join between source 1 and source 2.
# We'll assume that source2 is a small-ish dimension and the
# source1 is largish facts
aboutDim = dict( (makeKey2(row),row) for row in rdr2 )
for row in rdr1:
connection, dayList = mine_and_combine( row, aboutDim[ makeKey1(row) ] )
for d in dayList:
dayFile[d].write( connection )
flags = [ 1 if d is in dayList else 0 for d in range(6) ]
combined.write( connection, flags )
类似的东西。
要点是:
一次通过每个数据源。没有嵌套循环。 O ( n )处理。
保留尽可能少的内存,以创建有用的结果。