Различные способы чтения больших данных в python

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

1.f=gzip.open(file,'r') for line in f: process line #how can I process nth line? can I? 2.f=gzip.open(file,'r').readlines() #f is a list f[10000] #we can process nth line 3.f=gzip.open(file,'r') while True: linelist=list(islice(f,4)) 4.for line in fileinput.input(): process line 

В чем разница между 2 и 3? Я просто считаю, что их использование памяти одинаково. islice () также необходимо сначала загрузить весь файл в память (но только потом побить бит). И я слышал, что 4-й метод является наименее запоминающимся, он по-настоящему обрабатывается по-разному, не так ли? Для файла размером 10 ГБ, какой метод чтения файлов вы бы порекомендовали? Любые мысли / информация приветствуются. спасибо

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

 f1=open(inputfile1, 'r') while True: line_group1 = list(islice(f1, 3)) if not line_group1: break #then process specific lines say, the second line. processed 2nd line if ( ....): LIST1.append(line_group1[0]) LIST1.append(processed 2nd line) LIST1.append(line_group1[2]) 

И затем sth. как

 with open(file,'r') as f, for line in f: # process line 

возможно, не работает, я прав?

  • Сериализуемые объекты Python json
  • В чем разница между Model.id и Model.pk в django?
  • Как отправить значение HTTP POST на страницу (PHP) с помощью Python?
  • Python на Snow Leopard, как открыть> 255 сокетов?
  • Как вызвать MATLAB для Python для кластера?
  • Запустить фоновый процесс / демон из сценария CGI
  • Фильтрация массива в Python с двумя условиями
  • подгонка кривой с помощью python
  • 5 Solutions collect form web for “Различные способы чтения больших данных в python”

    Ты забыл –

     with open(...) as f: for line in f: <do something with line> 

    Оператор with обрабатывает открытие и закрытие файла, в том числе, если во внутреннем блоке создается исключение. В for line in f рассматривается файловый объект f как итеративный, который автоматически использует буферизованное управление вводами и памятью, поэтому вам не нужно беспокоиться о больших файлах.

    Оба 2,3 не рекомендуются для больших файлов, поскольку они читают и загружают все содержимое файла в памяти до начала обработки. Чтобы прочитать большие файлы, вам нужно найти способы не читать весь файл за один раз.

    Должен быть один – и желательно только один – очевидный способ сделать это.

    Просмотрите беседы Дэвида М. Бейсли о разборе больших файлов журнала с генераторами (см. Pdf для презентации):

    http://www.dabeaz.com/generators/

    Вы можете использовать enumerate для получения индекса, когда вы перебираете что-то:

     for idx, line in enumerate(f): # process line 

    Простая и эффективная память. Вы также можете использовать islice и перебирать его без преобразования в список:

     for line in islice(f,start,stop): # process line 

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

    Что касается fileinput , это всего лишь вспомогательный класс для быстрого циклирования по стандартным входам или списка файлов, нет никакой выгоды от эффективности использования памяти.

    Как указывает Шрикар, использование оператора with является предпочтительным способом открытия / закрытия файла.

    вы не знаете, сколько строк пока вы не прочитаете и не подсчитаете, сколько \ n в нем. В 1 вы можете добавить перечисление, чтобы получить номер строки.

    Для чтения определенных строк в больших файлах вы можете использовать библиотеку linecache .

    Python - лучший язык программирования в мире.