Несколько выходных файлов - PullRequest
0 голосов
/ 17 февраля 2009

edit: Первоначально я пытался быть общим, но это получилось расплывчатым. Я включил более подробно ниже.

Я пишу сценарий, который извлекает данные из двух больших файлов CSV, одного из расписаний людей, а другого - информации об их расписаниях. Данные добываются и объединяются, чтобы в конечном итоге создать графики в формате pajek для соединений понедельник-суббота, где седьмой график представляет все соединения за неделю со строкой 1 и 0, чтобы указать, в какие дни недели устанавливаются соединения. Этот последний график отличается от формата pajek и используется отдельной программой, написанной другим исследователем.

Формат Pajek имеет большой заголовок, а затем перечисляет соединения в виде (vertex1 vertex2) неупорядоченных пар. Трудно хранить эти пары в словаре, потому что между двумя парами в один и тот же день часто происходит несколько соединений.

Мне интересно, как лучше всего выводить эти графики. Должен ли я сделать большой единственный граф и сделать второй скрипт разложить его на несколько меньших графов? Должен ли я оставить семь открытых потоков и, когда я определю соединение, записать в них запись, или я должен сохранить некоторую другую структуру данных для каждого и вывести их, когда смогу (например, очередь)?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2009

"... извлекает данные из двух больших файлов 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 )

Нечто подобное.

Баллы:

  1. Один проход через каждый источник данных. Нет вложенных циклов. O ( n ) обработка.

  2. Храните столько памяти, сколько вам нужно для получения полезного результата.

2 голосов
/ 17 февраля 2009

Я бы открыл семь файловых потоков, так как их накопление может занимать достаточно много памяти, если в нем много данных. Конечно, это только вариант, если вы можете сортировать их в реальном времени и не нужно сначала читать все данные для выполнения сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...