Что нового

Быстрота выполнения - Файлы (чтение/запись), Текст (поиск).

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Есть много лог файлов, в которых от 200 до 500 строк.
Задача скрипта найти в файле error.log и вытащить текст
из таких скобок <> и записать в 2_error.log построчно,
все остальные строки записать в 1_error.log

Файл error.log в 365 строк примерно такого содержания:
2010 : любой текст (тут всю строку записать в 1_error.log)
2010 : любой текст <искомый текст> любой текст (тут искомый текст записать в 2_error.log)

Отрабатывает при пустом 1_error.log и пустом 2_error.log за такое время: >Exit code: 0 Time: 1.900
При следующих запусках (дозапись уже идет) время увеличивается: от 2.000 до 2.300
Этот временной показатель нормальный? Или можно как-то код более оптимизированнее составить?
Интересует так же ваше мнение, критика о стиле написания кода.
Вот сам код:
Код:
$file = FileOpen("error.log", 0)
If $file = -1 Then
    MsgBox(16, "Ошибка", "Не могу открыть файл" & @CRLF & "error.log")
    Exit
EndIf

While 1
    $line = FileReadLine($file)
	If @error = -1 Then ExitLoop	
    $MyArrayString = StringRegExp($line, '<(.*?)>', 1, 1)	
	If @error = 1 Then			
		Call("Error_1")	
	Else			
		Call("Error_2")	
	EndIf	
Wend

FileClose($file)

Func Error_1()
	$fileError_1 = FileOpen("1_error.log", 1)
	If $fileError_1 = -1 Then
		MsgBox(16, "Ошибка", "Не могу открыть файл" & @CRLF & "1_error.log")
	Exit	
	EndIf
	FileWrite($fileError_1, $line & @CRLF)
	FileClose($fileError_1)
EndFunc

Func Error_2()
	$fileError_2 = FileOpen("2_error.log", 1)
	If $fileError_2 = -1 Then	
		MsgBox(16, "Ошибка", "Не могу открыть файл" & @CRLF & "2_error.log")
	Exit
	EndIf
	FileWrite($fileError_2, $MyArrayString[0] & @CRLF)
	FileClose($fileError_2)
EndFunc
 

SyDr

Сидра
Сообщения
651
Репутация
158
1) Call писать необязательно. Да и вообще, в функции обычно выделяется блок, которой вызывается в программе в более, чем одном месте.
2) Все файлы открывай и закрывай ровно 1 раз. У тебя же открытие файлов происходит для каждой строчки лога.

Код:
$hFileInput = FileOpen("error.log", 0)
If $hFileInput = -1 Then
    MsgBox(16, "Ошибка", "Не могу открыть файл" & @CRLF & "error.log")
    Exit
EndIf
$hFileOutput_1 = FileOpen("1_error.log", 1)
    If $hFileOutput_1 = -1 Then
        MsgBox(16, "Ошибка", "Не могу открыть файл" & @CRLF & "1_error.log")
    Exit
EndIf
$hFileOutput_2 = FileOpen("2_error.log", 1)
    If $hFileOutput_2 = -1 Then
        MsgBox(16, "Ошибка", "Не могу открыть файл" & @CRLF & "2_error.log")
    Exit
EndIf

While 1
    $line = FileReadLine($hFileInput)
    If @error = -1 Then ExitLoop
    $MyArrayString = StringRegExp($line, '<(.*?)>', 1, 1)
    If @error = 1 Then
        FileWrite($hFileOutput_1, $line & @CRLF)
    Else
        FileWrite($hFileOutput_2, $MyArrayString[0] & @CRLF)
    EndIf
Wend

FileClose($hFileInput)
FileClose($hFileOutput_1)
FileClose($hFileOutput_2)
 
Автор
Yuri

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
SyDr
Спасибо.
Быстрота выполнения гораздо выше!. Time: 0.330
Про функции пока не совсем понятно, но буду учиться.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Для справки. Самое быстрое чтение/запись файла достигается тогда, когда файл читается/пишется весь целиком за один раз. FileReadLine() и подобные функции сильно снижают быстродействие.

;)
 
Автор
Yuri

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Yashied
Спасибо.
Учту на будущее.
Если я воспользуюсь _FileReadToArray и _FileWriteFromArray
скорость будет выше? Хотя что гадать. Попробую.

Проверил по примеру из справки:
Код:
#include<Array.au3>
#include<File.au3>
Dim $a_Test
_FileReadToArray("test.txt",$a_Test)
_FileWriteFromArray("test2.txt",$a_Test, 1)

Этот маленький кусочек кода отработал за
>Exit code: 0 Time: 0.360
Файл test.txt брал маленький = 616 байт

Всем спасибо.
Тему закрываю.
 
Верх