【问题标题】:Multiple output files多个输出文件
【发布时间】:2009-02-17 00:29:18
【问题描述】:

编辑:最初我试图笼统,但结果含糊不清。我在下面提供了更多详细信息。

我正在编写一个脚本,该脚本从两个大型 CSV 文件中提取数据,一个是人们的日程安排,另一个是有关他们日程安排的信息。对数据进行挖掘和组合,最终为周一至周六的人们连接创建 pajek 格式图,第七张图表示一周内的所有连接,用 1 和 0 的字符串表示一周中的哪几天建立了连接。最后一张图与 pajek 格式不同,由另一位研究人员编写的单独程序使用。

Pajek 格式有一个大标题,然后将连接列为 (vertex1 vertex2) 无序对。很难将这些对存储在字典中,因为两对之间通常在同一天有多个连接。

我想知道输出到这些图表的最佳方式是什么。我应该制作大型单图并让第二个脚本将其解构为几个较小的图吗?我应该保持 7 个流处于打开状态并在确定连接时写入它们,还是应该为每个流保留一些其他数据结构并在可能的时候输出它们(如队列)?

【问题讨论】:

  • @Lonnen:重要的一课(我几乎每天都应用)。尽量避免泛化。细节很重要。
  • @Lonnen:“挖掘和合并”?通过您的脚本或其他应用程序?

标签: python file-io


【解决方案1】:

“...从两个大型 CSV 文件中提取数据,一个是人们的日程安排,另一个是有关他们日程安排的信息。” 含糊不清,但我想我明白了。

“对数据进行挖掘和组合,最终为周一至周六的人们联系创建 pajek 格式图表,” 进行挖掘和组合。凉爽的。在哪里?在这个脚本中?在另一个应用程序中?通过一些第 3 方模块?通过一些网络服务?

这是一次一行的算法吗?一行输入是否会产生一个连接,该连接会发送到一个或多个每日图表?

这是一种必须先查看整个时间表才能产生任何结果的算法吗? [如果是这样,那可能是错误的,但我真的不知道,你的问题在这个中心细节上相当模糊。]

"...第七个图表,表示一周内的所有连接,用 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 )

类似的东西。

要点是:

  1. 遍历每个数据源。没有嵌套循环。 O(n) 次处理。

  2. 尽可能少地保留内存以创建有用的结果。

【讨论】:

  • 在脚本的早期组合。个人数据的一行输入会产生大约 60 行的输出,并且由于某些数据没有标准化(手动输入),因此需要进行大量的规范化和处理。不过谢谢,这对您很有帮助。
【解决方案2】:

我会打开七个文件流,因为如果数据很多,累积它们可能会占用大量内存。当然,如果您可以对它们进行实时排序并且不需要首先读取所有数据来进行排序,那只是一种选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2015-12-28
    相关资源
    最近更新 更多