2015-08-13 3 views
-4

Я пытаюсь запустить RE в своем приложении Lazarus на компоненте SynEdit, но это слишком медленно, даже замораживая мое приложение. Мой файл довольно большой (1.5gb), но когда я RE использую Sublime Text, он обрабатывает все очень быстро (вопрос секунд). Итак, что я делаю, я загружаю свой файл CSV в свой компонент SynEdit и обрабатываю RE оттуда. Что-то вроде этого:Регулярное медленное в Лазаресе. Что мне делать?

mySynEdit.LoadFromFile('myFile.CSV'); 
... 
var 
rx:Tregexpr; 
res:String; 
button.click... 
begin 
    rx:=TRegexpr.create; 
    rx.expression:='myRE'; 
    try 
    res:=rx.replace(mySynEdit.Text, 'myReplaceText', true); 
    mySynEdit.text:=res; 
    finally 
    rx.Free; 
    end; 
end; 

Любая подсказка о том, почему так долго требуется обработать этот файл? Должен ли я использовать другую «более быструю» библиотеку? Поэтому, пожалуйста, помогите мне ускорить этот процесс.

Спасибо, как всегда J

+1

Что такое регулярное выражение? Можете ли вы воспроизвести это на regex101.com? –

+2

Это synedit, который так медленно выбирает определенную строку, или регулярное выражение ищет линию? IOW, это не должно быть регулярное выражение. Попробуйте то же самое с текстом в более удобном для доступа формате, например. TStringList (или аналогичный) и посмотрите, слишком ли он медленный. Если нет, это был Synedit. Обратите внимание, что 1,5 ГБ может привести к загрузке текста из основной памяти и из нее, что может быть очень медленным. В этом случае может потребоваться другой подход (например, файл с отображением памяти). –

+10

SynEdit - синтаксический ярлык. Вы кормите его текстовым файлом 1,5 ГБ. Это сразу заставляет нас подозревать, что время hog здесь - огромная задача разбора этого текстового файла 1,5 ГБ для токенов синтаксиса. Определенно согласен с @RudyVelthuis - вам нужно проверить это с помощью более разумного контейнера для вашего текста. Профиль (или даже просто установить точку останова) - узнайте, где находится ваше узкое место. –

ответ

0

Вы обрабатываете свой поиск на копию, потому что mySynEdit.Text является добытчиком, который соединяет каждую строку в строку (следовательно, он выделяет и перемещает много, чтобы построить .Text). Таким образом, вы можете увидеть Improvment производительности при поиске и замене построчно:

for line in mySynEdit.Lines do begin 
    // 
end; 

На самом деле текст, отображаемый в SynEdit не существует как большой прилежащей chunck памяти. Все разделяется по строкам.

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

Также обратите внимание, что если вы используете вилку Lazarus SynEdit, существуют некоторые помощники для поиска в SynEdit, вкл. используя некоторые RegExes, в TCustomSynEdit:

function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer; 
function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer; 
+0

Привет, ребята, я хочу поблагодарить всех вас за помощь. До сих пор я пытался решить проблему, не используя какой-либо визуальный компонент. Я создал Thread, в котором я добавил TStringList для загрузки и обработки Regex. Но все еще слишком медленно. @Nested тип, я пытаюсь использовать SearchReplaceEx в своем SynEdit, но он не принимает [ssoOptions] ... вот так: SynEdit1.SearchReplaceEx ('myRegex', 'ReplaceText', [ssoReplaceAll, ssoRegExpr], Point (1,1)); Я использую FPC 2.6.4 - Lazarus 1.4 – Jay

+0

@jufau, не передавая нам MCVE, делает невозможным вам помочь. Почему ты этого не сделаешь? –

Смежные вопросы