2016-10-13 5 views
0

Я пытался обработать мой огромный файл CSV (более 20G), но процесс был убит при чтении всего CSV-файла в память. Чтобы избежать этой проблемы, я пытаюсь прочитать второй столбец за строкой.эффективно прочитал данные из огромного файла CSV

Например, второй столбец содержит данные, как

  1. ххх, компьютер хорошо
  2. ххх, построить алгоритм

    import collections 
    
    wordcount = collections.Counter() 
    
    with open('desc.csv', 'rb') as infile: 
        for line in infile: 
         wordcount.update(line.split()) 
    

Мой код работает для целых столбцов , как читать только второй столбец без использования CSV-ридера?

+0

Вы можете использовать итерацию (для циклов/выход) вместо загрузки большого количества данных в память. Я не знаю, сколько у вас контроля над отдельными частями, поэтому я не могу привести пример. –

+0

@DennisKuypers, спасибо. что вы подразумеваете под контролем? – Kun

+0

Что я имею в виду: Можете ли вы изменить код или просто взять результат одной библиотеки в следующую. Возможно, вы можете использовать 'для чего-то в descs:' для повторения результатов по одному. Вероятно, вы должны опустить '.tolist()'. Опять же, я не знаю библиотеки, поэтому я не могу сказать вам правильный путь. –

ответ

0

Насколько я знаю, вызов csv.reader(infile) открывает и читает весь файл ... в котором находится ваша проблема.

Вы можете просто прочитать строку за строкой и анализировать вручную:

X=[] 

with open('desc.csv', 'r') as infile:  
    for line in infile: 
     # Split on comma first 
     cols = [x.strip() for x in line.split(',')] 

     # Grab 2nd "column" 
     col2 = cols[1] 

     # Split on spaces 
     words = [x.strip() for x in col2.split(' ')] 
     for word in words:  
     if word not in X: 
      X.append(word) 

for w in X: 
    print w 

Это будет держать меньший кусок файла в памяти в данный момент времени (одна линия). Тем не менее, у вас все еще могут быть проблемы с переменной X, увеличивающейся до довольно большого размера, так что программа выйдет из строя из-за ограничений памяти. Зависит от того, сколько уникальных слов в списке «словарного»

+0

Спасибо, но ваш пример работает только для первого столбца, верно? Если бы это был третий столбец, x.strip() не был бы прав, правильно? – Kun

+0

Извините, может быть, я неправильно понял, что вы имели в виду под колоннами. Я предположил, что «компьютер хорош» был на собственной линии, а затем «построить алгоритм» на следующей строке. Где я использовал 'x.strip()'/'split()' мог бы быть 'csv.reader()' так же легко, если это работает для ваших входных файлов. – bornruffians

+0

вы можете изменить свой ответ, потому что он не работает – Kun

0

Похоже, что код в вашем вопросе читает файл 20G и расщепление каждой линию в пространстве, разделенные лексемы затем создать счетчик, который хранит счетчик каждые уникальных маркер. Я бы сказал, что именно там твоя память идет.

С ручной csv.reader итератор

объект читателя, который будет перебирать строки в данной csvfile. csvfile может быть любой объект, который поддерживает протокол итератора и возвращает строку, каждый раз, когда его следующий метод() называется

так это прекрасно, чтобы перебирать огромный файл, используя csv.reader.

import collections 

wordcount = collections.Counter() 

with open('desc.csv', 'rb') as infile: 
    for row in csv.reader(infile): 
     # count words in strings from second column 
     wordcount.update(row[1].split()) 
Смежные вопросы