"... извлекает данные из двух больших файлов CSV, одного из расписаний людей, а другого - информации об их расписаниях." Неопределенно, но, думаю, я понял.
"Данные добываются и объединяются, чтобы в конечном итоге создать графики в формате паджек для соединений понедельник-суббота народов", Разобраться и объединить. Здорово. Куда? В этом сценарии? В другом приложении? По какому-то стороннему модулю? По какому-то веб-сервису?
Является ли этот алгоритм по очереди? Создает ли одна строка ввода одно соединение, которое отправляется на один или несколько дневных графиков?
Является ли это алгоритм, который должен видеть весь график, прежде чем он может что-либо производить? [Если это так, то, вероятно, это неправильно, но я не совсем знаю, и ваш вопрос довольно расплывчат в этой центральной детали.]
"... седьмой график, представляющий все соединения за неделю со строкой 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 ) обработка.
Храните столько памяти, сколько вам нужно для получения полезного результата.