|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.06.2017, 17:28 | #1 |
Пользователь
Регистрация: 06.11.2012
Сообщений: 67
|
Чтение большого файла.
Добрый день.
Нужно реализовать программу, открывающую файл (~15 ГБ) и выводящую количество символов в нём на форму раз в секунду посредством таймера. Код:
Код:
|
24.06.2017, 20:34 | #2 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Application.ProcessMessages; надо поместить в цикл, а из таймера убрать.
Код:
Application.ProcessMessages; - переведём дословно, что получится? Получиться команда "Приложение, обработай сообщения." Эта команда заставляет приложение обработать очередь сообщения извлечь из неё все сообщения и если там встретиться сообщение для таймера, то вызвать его.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 24.06.2017 в 20:38. |
26.06.2017, 08:10 | #3 |
Пользователь
Регистрация: 06.11.2012
Сообщений: 67
|
Сделал по вашему, выставил интервал таймера 1мс. Прогресс виден, однако работа всё равно прерывается на 17МБ. Возможно, ReadLn не подходит для чтения больших файлов?
|
26.06.2017, 09:02 | #4 | |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Цитата:
раз в секунду никак... кроме того смущает List.Add(Buffer); если не найдет '****' - памяти есть 15гб и 64бит сборка? на пальцах объясни что с файлом делаешь, кроме подсчета символов, и что за магия со звездочками... и как часто звездочки встречаются
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 26.06.2017 в 09:04. |
|
26.06.2017, 09:31 | #5 |
Пользователь
Регистрация: 06.11.2012
Сообщений: 67
|
Некорректная работа eof()
Открываю очень большой файл на начинаю читать из него.
В какой то момент чтение прерывается, будто бы файл окончился, однако читать из него дальше можно. Как работает eof? Получает какой то символ конца программы? Каким образом прочитать весь файл в моей ситуации? Код:
|
26.06.2017, 09:36 | #6 |
Пользователь
Регистрация: 06.11.2012
Сообщений: 67
|
Найдёт. Какой-то софт генерирует базу формата
Код:
|
26.06.2017, 09:39 | #7 |
Пользователь
Регистрация: 06.11.2012
Сообщений: 67
|
Как оказалось, работа прерывается всегда на одной и той же строчке, будто бы eof() принимает завершающий символ. Но дальше читать можно и нужно. Можно сотворить костыль и зациклить eof(), но это как-то дико.
|
26.06.2017, 09:58 | #8 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Забудьте уже про TextFile.
Читайте через TFileStream (говорят, ещё можно работать с большими файлами через отображение файла в память, но у меня нет такого опыта). Последний раз редактировалось Serge_Bliznykov; 26.06.2017 в 10:28. |
26.06.2017, 10:05 | #9 |
Пользователь
Регистрация: 06.11.2012
Сообщений: 67
|
А чем мне поможет это в данном случае? Полагаю, там будет тот же системный вызов, что и для eof(), и проблема никуда не уйдет.
|
26.06.2017, 10:26 | #10 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
тем более, что в TFileStream нет никакого eof()! там есть размер (size) обрабатываемых записей. p.s. лирического отступление. TextFile предназначен для обработки текстовых файлов. Текстовые файлы - это файлы, которые состоят ИСКЛЮЧИТЕЛЬНО из печатных символов. Допускаются некоторые непечатные (служебные, переводы строк, например). Но именно допускаются и именно некоторые. создайте файлик, поместите туда символы с кодом 26 и 27 а потом текст и попробуйте прочитать. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача файла большого размера | Shouldercannon | Общие вопросы Delphi | 12 | 09.03.2016 20:35 |
Выборка данных из большого файла | linap | Общие вопросы Delphi | 6 | 01.10.2013 10:06 |
РазXORивание большого файла | Человек_Борща | Общие вопросы Delphi | 9 | 21.05.2013 16:47 |
Запись большого файла на 2-ва DVD | Rembo | Софт | 32 | 14.02.2009 16:02 |