|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
20.11.2018, 07:15 | #1 |
Пользователь
Регистрация: 15.09.2018
Сообщений: 10
|
обработать большой текст
Доброго дня! Проблема с парсингом txt-лога размером больше 300Мб!!! Загружаю в stringlist из txt:
Код:
Код:
Изначально вся работа проги строится на стринглисте и синедите (там удобная подсветка слов по тексту). Временно решил часть проблемы расширением памяти под приложение ключом {$SETPEFLAGS $0020}, но на x32 упираюсь по-любому в 300Мб лога, а нужен 1Гб! Кто что посоветует? Желательно с кодом решений т.к. работаю в lazarusе только 6 мес.. |
20.11.2018, 07:48 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А зачем StringList? LoadFromFile есть и в SynEdit
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
20.11.2018, 12:51 | #3 |
Пользователь
Регистрация: 15.09.2018
Сообщений: 10
|
Задача - парсить весь лог и стринглист проще отрабатывает и быстрее..
Пробегаю по строкам-ищу например время записи(в виде цифр в начале каждой строки) и если надо - вывожу на синедит! А стринглист в памяти как исходный набор строк.. отловил основные причины роста памяти при загрузке и обработке: - стринглист удваивает размер исходного файла; - преобразование cp1251toutf8 ещё рост в 2 раза; - гружу в синедит - +столько же, и того в 6-7 раз растёт размер памяти под файл!!! Последний раз редактировалось Вадим Мошев; 21.11.2018 в 14:21. |
20.11.2018, 13:20 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
стринглист не удваивает
обращение к STR_ARR.Text + столько же памяти, как и в самом массиве строк стринглиста. преобразование cp1251toutf8 естесно еще столько + много чего, оно же мультибайтное lines в синедит это тоже strings со всеми вытекающими так что меняй логику )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 20.11.2018 в 13:22. |
20.11.2018, 13:30 | #5 |
Пользователь
Регистрация: 15.09.2018
Сообщений: 10
|
но без стринглиста при смене фильтров поиска придётся каждый раз грузить файл в память и обрабатывать его - хотелось остаться со стринглистом, а вот в синедит подгружать постранично фильтрованные строки? Но тогда я не знаю как организовать постраничный вывод и главное - как скроллбар организовать реальный на синедите - ведь в синедите будет не весь текст, а несколько страниц-навигация ползунка по тексту д.б. своя!
|
20.11.2018, 13:35 | #6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Можно смапить файл на память.
|
20.11.2018, 13:45 | #7 |
Пользователь
Регистрация: 15.09.2018
Сообщений: 10
|
..в памяти и скорости получим выигрыш?..пример очень выручил бы!..т.е. грузить в память файл и оттуда обрабатывать с выводом строк в синедит? со разбором строк из памяти не будет гемороя?
..и всё-же если кто подкинет пример по организации скролла при поблочной загрузке в окне syneditа и маппинг большого файла - буду очень признателен! Последний раз редактировалось Вадим Мошев; 21.11.2018 в 14:22. |
21.11.2018, 08:49 | #8 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Используйте ListBox1 в режиме виртуальной отрисовки.
Код:
PS. Перезалил архив, теперь с pas файлом. PPS. ListBox в лазарусе не доконца реализован.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 21.11.2018 в 14:28. Причина: Перезалил архив, теперь с pas файлом. |
21.11.2018, 12:12 | #9 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Pavia, у меня ваш проект на сгенерённом мной файлике (417 Мб) выдаёт Out of Memory
если Вам интересно - то файл генерил простенькой программкой:ProjectTest.rar (работает долго, у меня генерация происходит около 12 минут) |
21.11.2018, 13:17 | #10 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Проглядел, что 1 ГБ.
Два варианта решения: 1) Тогда да от StringList отказаться. Добавить полосу прокрути как отдельный компонент, задать ей диапазоны от размера файла. И при изменении полосы прокрутки загружать из файла необходимые данные. 2) Но я тут решил, что пора продвигать 64 бита в массы. Достаточно пересобрать программу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Чем бы отобразить очень большой текст? | i.polyakoff | JavaScript, Ajax | 5 | 15.04.2016 16:26 |
Как обработать текст в буфере перед вставкой в edit? | Dux | Общие вопросы Delphi | 36 | 17.02.2016 13:11 |
Задан текст, состоящий из строк произвольной длины. Обработать текст, подсчитав количество строк и отсортировав их (Паскаль) | Александр_Прог | Помощь студентам | 3 | 24.03.2014 14:37 |
SetWindowTextA, SendMessageA - не ставит большой текст ( | PASHAsoska | Общие вопросы Delphi | 3 | 30.11.2012 15:51 |
write и большой текст | Rebelition | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 21.06.2011 21:41 |