![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#12 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
согласен, через TStringList наиболее просто и, скорее всего не медленее, чем через TFileStream...
А вот чтение/запись построчно, я уверен, будет медленее, чем вышеупомянутые методы. Эти методы являются устаревшими и, в основном, оставлены для обратной совместимости. поэтому код просто для ознакомления и саморазвития (а не для использования!): Код:
|
![]() |
![]() |
![]() |
#13 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]()
Стринглист в этой задаче как корове седло.
Нет никакой гарантии что файл будет целиком в него загружен - при определенном состоянии кучи и достаточно большом размере файла обязательно возникнет исключение. Решение - в использовании файловых потоков, заточеных под работу со строковыми данными. |
![]() |
![]() |
![]() |
#14 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
За "очень" многолетний опыт использования - ни разу такого не было. Другое дело, что огромный файл может грузиться ну о-о-о-очень долго! Это да! А с памятью - винда, при необходимости, начнёт откусывать от виртуальной памяти (файла подкачки)... Ну, разумеется, если текстовый файл размером гига 4 (или на диске места свободного нет, или размер виртуальной памяти ограничен или ...) , то при определённых условиях с чтением такого файла будут проблемы... Но мы же говорим про нормальные текстовые файлы! Кстати, можете продемонстрировать это Ваше утверждение на конкретном примере?! Цитата:
какие потоки заточены под работу со строками? |
||
![]() |
![]() |
![]() |
#15 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
Цитата:
![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
![]() |
![]() |
![]() |
#16 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
Только не стринглисты, я вас прошу.
1) Мапим очередной гигабайт из файла в память 2) Сканируем память, подсчитываем количество символов перевода строки 3) Насчитали 30000? Если нет, то шаг 1, иначе шаг 4 4) В цикле погигабайтно скидываем остатки файла из памяти в новый файл. 5) Стоп машина. Почему погигабайтно? Ну обычно гиг нам видна выдаст. А больше не надо. Если не выдаст, заменить гиг на полгига. Если и полгига не выдаст, заменить комп.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#17 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]()
Delphi Example
Код:
программа — запись алгоритма на языке понятном транслятору
|
![]() |
![]() |
![]() |
#18 |
Участник клуба
Регистрация: 28.03.2007
Сообщений: 1,814
|
![]()
Ещё один вопрос: - насколько большой размер файла?.
Я с помощью того же стринглиста создал файл в 50000 строк, потом загрузил в другой стринглист этот файл. Загрузка произошла менее чем за 1сек.(если точнее 31 мс). а удаление первых 20000 строк за 1,2сек. вроде не так уж и долго. Можно конечно использовать memorystream или filestream и считывать кусками в какой нибудь буфер, НО нужно будет подсчитывать сколько раз встретилось переходов на новую строку и т.д. а это уже получается геморойный алгоритм. Хотя это только моё предположение приведу пример создания загрузки и удаления строк через стринглист 1. создание файла в 50000 строк Код:
Код:
|
![]() |
![]() |
![]() |
#19 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
но, имхо, если вместо удаления, Вы создадите НОВЫЙ (ещё один) объект TStringlist и банально перепишете туда оставшиеся строчки: Код:
это раз. А второе, а почему Вы берёте конечные тики до сохранения файла?! Время сохранения результирующего файла тоже надо учитывать! |
|
![]() |
![]() |
![]() |
#20 |
Участник клуба
Регистрация: 28.03.2007
Сообщений: 1,814
|
![]() Код:
Просто я автору хочу сказать что в его случае не стоит усложнять себе жизнь и делать через стринглист ![]() Последний раз редактировалось SERG1980; 27.01.2011 в 15:05. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Развернуть наизнанку изображение на экране (каким образом такое возможно) | Synthesis | Общие вопросы C/C++ | 3 | 31.03.2010 19:09 |
Каким образом процессор обращается к портам | Ivan_32 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 30.07.2009 12:29 |
Возможно ли удалить, вырезать, определенную строку в TMemo | Des | Компоненты Delphi | 2 | 28.04.2009 16:21 |
ссылка через определенное количество строк | chaostt | Microsoft Office Excel | 7 | 03.04.2009 18:14 |
Каким образом скопировать файл? | Kashp | Общие вопросы Delphi | 14 | 07.08.2007 11:44 |