![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| klyaksa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
Нужно !дописывать! немного в текстовый файл. Загружать в TStringList, добавлять и записывать не дело - значительно дольше, особенно при больших файлах - проверено.
AssignFile(f, ResultFullFileName); if not FileExists(ResultFullFileName) then ReWrite(f) else Append(f); //--- for I := 0 to StringList.Count - 1 do Writeln(f, StringList[I]); Намного быстрее... Но с переходом на 2009/2010 возник вопрос - а как реализовать запись в ansi и в unicode? TStringList - вроде понятно, там параметр добавился, а как быть с Writeln? |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Перекодировать строку в нужный формат перед передачей в Writeln? -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
klyaksa, зачем же сразу переходить на старый паскалевский файловый доступ. Открываем файл при помощи TFileStream, перемещаем файловый указатель в конец и пишем сколько влезет, хоть 1Тб .
Добавлено через 6 минут и 4 секунды Кстати для удобства работы со строками лучше использовать дополнительный класс TWriter http://forum.vingrad.ru/forum/topic-250409.html -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Alexeis, ты ничего не попутал?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ты по поводу чего? Размер больше 4х Гб TFileStrem точно умеет, хотя в этой теме вопрос размер не актуален. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| klyaksa |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
При увеличении размера сильно растет время... Хотя AssignFile(f, ResultFullFileName); if not FileExists(ResultFullFileName) then ReWrite(f) else Append(f); продолжает писать как и писал - быстро. Добавлено через 13 минут и 31 секунду Да и еще как оказалось способ 1 - пишет Не уникод способ 2 - может и так и так способ 3 - почему-то Не уникод. Это видно и по размерам получаемых файлов.... |
||||
|
|||||
| klyaksa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
пс
способ 1 - в первом сообщении (он самый быстрый) способ 2- загрузить в StringList, дописать и сохранить (медлено, но можно уникод и нет) способ 3 - чуть выше (медлено, почему-то не уникод) |
|||
|
||||
| RomanEEP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
странно при обоих методах компилятор должен генерировать сходный код может заменить
fs.Seek(1, soEnd); на fs.Seek(0, soEnd); |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
klyaksa, TFileStream.Write вызывает почти сразу WinApi функцию WriteFile(THandle(Handle), Buffer, Count, LongWord(Result), nil) , так что это максимально быстро. Возможно разница в том, что при записи юникода объем в 2 раза больше, вот и время записи выше.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ааа, все понял! Прошел дебагом. Дело в буферизации. Writeln буферизирует вывод в файл до CloseFile , тоже самое можно сделать если вывод делать в TMemoryStream , а затем из него копировать в TFileStream при помощи метода CopyFrom. Метод CopyFrom записывает данные буфером 61440 . Думаю, что такой режим будет аналогичен Writeln .
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| klyaksa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
Вряд ли только.... Тестировал все 3 варианта в цикле 1000 итераций. Записывал (дописывал) всего по 3 строки. При первом запуске (когда вначале файлов нет и они создаются в первой из 1000 итерации) способ. 1 - менее сек., сп. 2 и 3 около 3 сек. Следующий запуск 1 сп. - как было, 2 и 3 уже больше... пятый запуск (файлы уже не очень маленькие) - 1 сп. - меньше секунды, 2 и 3 несколько !десятков! секунд. Старый writeln - быстро, но без юникода, по другому можно и юникод но долго. Вот как бы быстро дописать текст в текстовый файл причем по желанию либо ansi, либо unicode? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Еще как может быть. Накладных расходов на запись 5 ти байт в современных системах наверное как на 1кб . Так что буферизация иногда может дать прирост и в сотни раз. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| klyaksa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
Хочу получить нормальный текстовый файл, но получается фигня в виде иероглифов. Где моя ошибка?
|
|||
|
||||
| klyaksa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
Вот так вроде бы заработало...
Добавлено через 7 минут и 26 секунд Alexeis, да, кстати, так достаточно быстро, от размера файла на глаз не зависти, 1000 итераций за 4.* секунд... |
|||
|
||||
| klyaksa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 15.9.2005 Репутация: нет Всего: нет |
Все вопрос решен (наверное
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |