Это мой второй день работы в Python. Я некоторое время работал над этим на C++, но решил попробовать Python. Моя программа работает так, как ожидалось. Однако, когда я обрабатываю один файл за один раз без цикла glob, он занимает около получаса за файл. Когда я включаю glob, цикл занимает около 12 часов для обработки 8 файлов.Цитирование через большие файлы занимает часы в Python
Мой вопрос в том, есть ли что-нибудь в моей программе, которое определенно замедляет его? есть ли что-нибудь, что я должен делать, чтобы сделать это быстрее?
У меня есть папка с большими файлами. Например
file1.txt (6gb) file2.txt (5.5gb) file3.txt (6gb)
Если это помогает, каждая строка данных начинается с символа, который говорит мне, как все остальные символы отформатированы, поэтому у меня есть все утверждения if elif. Линия данных будет выглядеть следующим образом: T35201 M352 RZNGA AC
Я пытаюсь читать каждый файл, сделать некоторый синтаксический анализ с помощью шпагата, а затем сохраните файл.
Компьютер имеет 32 ГБ оперативной памяти, поэтому мой метод состоит в том, чтобы читать каждый файл в ram, а затем прокручивать файл, а затем сохранять, освобождая RAM для следующего файла.
Я включил файл, чтобы вы могли видеть методы, которые я использую. Я использую оператор if elif, который использует около 10 различных команд elif. Я пробовал словарь, но я не мог понять это, чтобы спасти свою жизнь.
Любые ответы были бы полезными.
import csv
import glob
for filename in glob.glob("/media/3tb/5may/*.txt"):
f = open(filename,'r')
c = csv.writer(open(filename + '.csv','wb'))
second=0
mill=0
for line in f.readlines():
#print line
event=0
ticker=0
marketCategory=0
variable = line[0:1]
if variable is 'T':
second = line[1:6]
mill=0
else:
second = second
if variable is 'R':
ticker = line[1:7]
marketCategory = line[7:8]
elif variable is ...
elif variable is ...
elif ...
elif ...
elif ...
elif ...
elif
if variable (!= 'T') and (!= 'M')
c.writerow([second,mill,event ....])
f.close()
UPDATE Каждый из операторов Элиф почти идентичны. Единственными частями, которые меняются, являются способы разделить линии. Вот два заявления Элиф (Есть 13 общая, и почти все они идентичны за то, как они расщепляются, за исключением.)
elif variable is 'C':
order = line[1:10]
Shares = line[10:16]
match = line[16:25]
printable = line[25:26]
price = line[26:36]
elif variable is 'P':
ticker = line[17:23]
order = line[1:10]
buy = line[10:11]
shares = line[11:17]
price = line[23:33]
match = line[33:42]
UPDATE2 Я побежал код, используя for file in f
два различных раза. В первый раз я запустил один файл безfor filename in glob.glob("/media/3tb/file.txt"):
и потребовалось около 30 минут, вручную закодировав путь к файлу для одного файла.
Я запустил его снова сfor filename in glob.glob("/media/3tb/*file.txt")
и потребовался час только для одного файла в папке. Добавляет ли код glob столько времени?
Было бы просто изменить 'для строки в f.readlines():' to 'для строки в f:'. Таким образом, вы не читаете весь файл в памяти сразу, а скорее по одной строке за раз. Также 'variable = line [0: 1]' совпадает с 'variable = line [0]', что на самом деле не влияет на скорость. – 2013-02-22 14:05:03
use 'line [0] == 'T'' вместо' variable is' T''. Последний может потерпеть неудачу ('is' проверяет идентичность объекта и может быть более одного объекта' T '). – jfs
какую версию python вы используете? Вы также можете установить буферизацию и загрузить файл с помощью chuncks: buffersize = 50000000, buffer = infile.read (buffersize), в то время как len (buffer): здесь здесь – Drewdin