2014-11-17 3 views
0

Мне нужно обработать большой текстовый файл (4 ГБ). Который имеет следующие данные:Загрузка огромного текстового файла в python

12 23 34 
22 78 98 
76 56 77 

Здесь необходимо прочитать каждую строку, а также выполнить некоторую работу на основе линий. В настоящее время я делаю как:

sample = 'filename.txt' 

with open(sample) as f: 
    for line in f: 
     line = line.split() 
     line = [int(i) for i in line] 
     a = line[0] 
     b = line[1] 
     c = line[2] 
     do_someprocess() 

Требуется огромное количество времени для выполнения. Есть ли другой лучший способ сделать это в python?

+1

Что делает do_someprocess()? Вы уверены, что 'split()' и 'int()' являются функциями, использующими наибольшее время? – nathancahill

+1

Вы можете запустить python -m cProfile myscript.py, чтобы убедиться, что вы оптимизируете правильные функции. – nathancahill

ответ

0

split() возвращает вам список. И тогда вы пытаетесь получить доступ к первому, второму и третьему элементу,

line = [int(i) for i in line] 
    a = line[0] 
    b = line[1] 
    c = line[2] 

Вместо того, что вы можете сказать прямо a,b,c = line.split() тогда a будет содержать line[0], b будет содержать line[1] и c будет содержать line[2]. Это должно сэкономить вам некоторое время.

with open(sample) as f: 
    for line in f: 
     a,b,c = line.split() 
     do_someprocess() 

Пример:

with open("sample.txt","r") as f: 
    for line in f: 
     a,b,c = line.split() 
     print a,b,c 

.txt файл

12 34 45 
78 67 45 

Выход:

12 34 45 
78 67 45 

EDIT: Я думал о разработке на it.I использовали timeit() модуль t o сравнить время, затраченное на выполнение кода. Пожалуйста, дайте мне знать, если я что-то делаю неправильно. Следующим является способ OP для написания кода.

v = """ with open("sample.txt","r") as f: 
    for line in f: 
     line = line.split() 
     line = [int(i) for i in line] 
     a = line[0] 
     b = line[1] 
     c = line[2]""" 
import timeit 
print timeit.timeit(stmt=v, number=100000) 

Выход:

8.94879606286 ## seconds to complete 100000 times. 

Ниже мой способ написания кода.

s = """ with open("sample.txt","r") as f: 
      for line in f: 
       a,b,c = [int(s) for s in line.split()]""" 

import timeit 
print timeit.timeit(stmt=s, number=100000) 

Выходы:

7.60287380216 ## seconds to complete same number of times. 
+0

Обратите внимание, что это произойдет, если 'line' содержит более 3 элементов.Лучше сказать 'a, b, c = line.split() [: 3]' –

+0

OP только что упомянул только три значения данных в своем примере. –

+0

Ваш код пропускает шаг преобразования значений в int –

1

Если do_someprocess() занимает много времени по сравнению с чтением строк и у вас есть дополнительные процессорные ядра можно использовать модуль многопроцессорной.

Попробуйте использовать pypy, если это возможно. Для некоторых вычислительных интенсивных задач он в десятки раз быстрее, чем cpython

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

Первый шаг - профайл, как предлагает @nathancahill в комментариях. Затем сосредоточьте свои усилия на тех частях, где можно добиться наибольших успехов.