2014-08-27 3 views
0

У меня есть код, который я пытаюсь оптимизировать, чтобы быть более эффективным. Одна часть этого состоит в том, чтобы обработать мой файл и после каждой строки обработать, немедленно напишите его на csv. Это идеально, потому что я не трачу память, обрабатывая данные, а затем загружая данные в список, чтобы выписать весь список. Если добавить целые обработанные данные в список, я могу написать его csv без проблем, как показано ниже, при # write folded_data to csv:пишите каждую строку, когда она обрабатывается с использованием for-loop в python, но только для записи первой строки

Примечания: код при #data обработки тверд, и мне просто нужна помощь выписывая каждая строка обрабатывается.

# data processing 
seen = set() 
folded_data = [] 
for u in name_nodes: 
# seen=set([u]) # print both u-v, and v-u 
    seen.add(u) # don't print v-u 
    unbrs = set(B[u]) 
    nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - seen 
    for v in nbrs2: 
     vnbrs = set(B[v]) 
     common = unbrs & vnbrs 
     weight = len(common) 
     row = u, v, weight 
     folded_data.append(row) 

# write folded_data to csv 
with ('out_file.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerows(folded_data) 

Однако, когда я пытаюсь и выписывать каждый row, как она обрабатывается, я получаю только первую строку в «out_file.csv».

# data processing 
seen = set() 
for u in name_nodes: 
    # seen=set([u]) # print both u-v, and v-u 
    seen.add(u) # don't print v-u 
    unbrs = set(B[u]) 
    nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - seen 
    for v in nbrs2: 
     vnbrs = set(B[v]) 
     common = unbrs & vnbrs 
     weight = len(common) 
     row = u, v, weight 
     # write row for each line to csv 
     with open('out_file.csv', 'wb') as f: 
      writer = csv.writer(f) 
      writer.writerow(row) 

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

+0

Вы пытаетесь оптимизировать скорость или память? – therealrootuser

+0

@ mattingly890 - в первую очередь память, так как она в настоящее время пытается загрузить все в список и выписать список, у меня закончилась нехватка памяти. Хотя делать это быстрее, не так уж и плохо! :) –

ответ

1

Я сомневаюсь, что вы получаете первую линию, вы получаете последние линии. Для каждой строки, которую вы выписываете, вы снова открываете файл, стирая предыдущее содержимое. Поместите файл открытым и создайте запись csv за пределы цикла.

1

Я бы не стал беспокоиться о «растрате» памяти, если ваша программа не запросит (например,) более половины системной памяти. Если ваш CSV находится в диапазоне с несколькими гигабайтами (или больше), это вызывает беспокойство.

Если ваш csv не такой большой, ваш файл попадет в кеш-память ОС в памяти, если у вас нет нестандартных настроек ядра.

Чтобы сделать это «эффективным» способом (то есть, чтобы явным образом не хранить ваши данные в памяти), вам нужно открыть файл перед циклом for.

+0

Файл, который я пытаюсь выписать, составляет примерно 3/4 моей системной памяти. –

0

Придумал это с помощью @etep и @MarkRansom! Мне нужно открыть файл и определить writer перед целым for-loop.

# open file and define writer 
with open('out_file.csv', 'wb') as f: 
    writer = csv.writer(f) 

    # data processing 
    seen = set() 
    for u in name_nodes: 
    # seen=set([u]) # print both u-v, and v-u 
     seen.add(u) # don't print v-u 
     unbrs = set(B[u]) 
     nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - seen 
     for v in nbrs2: 
      vnbrs = set(B[v]) 
      common = unbrs & vnbrs 
      weight = len(common) 
      row = u, v, weight 
      # write row for each record 
      writer.writerow(row) 

 Смежные вопросы

  • Нет связанных вопросов^_^