Я выполняю задачу разбора / обработки «больших» необработанных данных, сгенерированных из оболочки unix. Эти необработанные данные необходимо проанализировать, чтобы очистить их от некоторых специальных символов.
В конечном итоге я хочу избежать необходимости большого временного файла и делать это на лету.
Способ 1 создает большой временный текстовый файл объемом 8 ГБ (не желательно), но быстро (8 минут выполнения): сначала я генерирую временный необработанный текстовый файл (я помещаю выходные данные оболочки в текстовый файл), а затем анализирую, используя следующий код: Время выполнения 8 минут, размер выходного файла 800 МБ:
f = open(filepath, 'r')
fOut= open(filepathOut,"w+")
for line in f:
if len(line) > 0:
if "RNC" in line:
rncflag = 1
#quito enter, quito cadena a la izquierda y quito comillas a la derecha
currline = line.strip('\n').strip('\t').replace(".",",").replace(" ","").lstrip(";")
else:
currline = line.strip('\n').strip('\t').replace(".",",").replace(" ","").lstrip(";")
if rncflag == 1:
if lineNumOne == 1:
processedline = currline
lineNumOne = 0
else:
processedline = '\n' + currline
rncflag = 0
else:
processedline = currline
fOut.write(processedline)
fOut.close()
Способ 2, на лету непосредственно из стандартного вывода (~ 1,5 часа полного выполнения): я бы предпочел это, поскольку мне не нужно генерировать предыдущий необработанный файл для анализа. Я использую библиотеку подпроцесса, чтобы анализировать / обрабатывать оболочку stdout unix непосредственно построчно, пока она генерируется (например, если это где строки в текстовом файле). Проблема в том, что он бесконечно медленнее, чем предыдущий способ. Время выполнения более 1,5 часов, чтобы получить тот же выходной файл (размер 800 МБ):
cmd = subprocess.Popen(isqlCmd, shell=True, stdout=subprocess.PIPE)
for line in cmd.stdout:
if len(line) > 0:
if "RNC" in line:
rncflag = 1
#quito enter, quito cadena a la izquierda y quito comillas a la derecha
currline = line.strip('\n').strip('\t').replace(".",",").replace(" ","").lstrip(";")
else:
currline = line.strip('\n').strip('\t').replace(".",",").replace(" ","").lstrip(";")
if rncflag == 1:
if lineNumOne == 1:
processedline = currline
lineNumOne = 0
else:
processedline = '\n' + currline
rncflag = 0
else:
processedline = currline
fOut.write(processedline)
fOut.close()
Я не python эксперт, но я уверен, что есть способ ускорить обработку если unix stdout на лету, вместо того, чтобы предварительно генерировать необработанный файл, чтобы проанализировать его после того, как он был сгенерирован.
Цель программы - очистить / проанализировать выходные данные запроса sybase i sql. Примечание: библиотека sybase не может быть установлена.
Python версия является -> Python 2.6.4 и не может быть изменена
Заранее спасибо, любые улучшения приветствуются.