|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.01.2011, 08:24 | #11 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
27.01.2011, 09:14 | #12 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
согласен, через TStringList наиболее просто и, скорее всего не медленее, чем через TFileStream...
А вот чтение/запись построчно, я уверен, будет медленее, чем вышеупомянутые методы. Эти методы являются устаревшими и, в основном, оставлены для обратной совместимости. поэтому код просто для ознакомления и саморазвития (а не для использования!): Код:
|
27.01.2011, 09:49 | #13 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Стринглист в этой задаче как корове седло.
Нет никакой гарантии что файл будет целиком в него загружен - при определенном состоянии кучи и достаточно большом размере файла обязательно возникнет исключение. Решение - в использовании файловых потоков, заточеных под работу со строковыми данными. |
27.01.2011, 10:55 | #14 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
За "очень" многолетний опыт использования - ни разу такого не было. Другое дело, что огромный файл может грузиться ну о-о-о-очень долго! Это да! А с памятью - винда, при необходимости, начнёт откусывать от виртуальной памяти (файла подкачки)... Ну, разумеется, если текстовый файл размером гига 4 (или на диске места свободного нет, или размер виртуальной памяти ограничен или ...) , то при определённых условиях с чтением такого файла будут проблемы... Но мы же говорим про нормальные текстовые файлы! Кстати, можете продемонстрировать это Ваше утверждение на конкретном примере?! Цитата:
какие потоки заточены под работу со строками? |
||
27.01.2011, 12:21 | #15 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
27.01.2011, 12:36 | #16 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Только не стринглисты, я вас прошу.
1) Мапим очередной гигабайт из файла в память 2) Сканируем память, подсчитываем количество символов перевода строки 3) Насчитали 30000? Если нет, то шаг 1, иначе шаг 4 4) В цикле погигабайтно скидываем остатки файла из памяти в новый файл. 5) Стоп машина. Почему погигабайтно? Ну обычно гиг нам видна выдаст. А больше не надо. Если не выдаст, заменить гиг на полгига. Если и полгига не выдаст, заменить комп.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
27.01.2011, 13:46 | #17 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,527
|
Delphi Example
Код:
программа — запись алгоритма на языке понятном транслятору
|
27.01.2011, 14:19 | #18 |
Участник клуба
Регистрация: 28.03.2007
Сообщений: 1,814
|
Ещё один вопрос: - насколько большой размер файла?.
Я с помощью того же стринглиста создал файл в 50000 строк, потом загрузил в другой стринглист этот файл. Загрузка произошла менее чем за 1сек.(если точнее 31 мс). а удаление первых 20000 строк за 1,2сек. вроде не так уж и долго. Можно конечно использовать memorystream или filestream и считывать кусками в какой нибудь буфер, НО нужно будет подсчитывать сколько раз встретилось переходов на новую строку и т.д. а это уже получается геморойный алгоритм. Хотя это только моё предположение приведу пример создания загрузки и удаления строк через стринглист 1. создание файла в 50000 строк Код:
Код:
|
27.01.2011, 14:52 | #19 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
но, имхо, если вместо удаления, Вы создадите НОВЫЙ (ещё один) объект TStringlist и банально перепишете туда оставшиеся строчки: Код:
это раз. А второе, а почему Вы берёте конечные тики до сохранения файла?! Время сохранения результирующего файла тоже надо учитывать! |
|
27.01.2011, 15:03 | #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 |