![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| posta |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 20.9.2005 Репутация: нет Всего: нет |
Подскажите, как можно удалить текущую строку из текстового файла?
Например, есть цикл, в котором за 1 раз удаляется первая строка файла. Особенно учитывая, что файл может достигать 4 гигов. Это сообщение отредактировал(а) posta - 25.6.2007, 03:41 |
|||
|
||||
| Sansa |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 3 Всего: 6 |
да, вариантов тут не много... Удаление строки из файла обычно производится созданием копии этого файла, за исключением первой строки
Если файл текстовый, то можно разбить его на куски, скажем по 100 Кб, и удалять уже из них. Если у тебя цикл, то может быть стоит загрузить часть в память, удалять из памяти, а в конце цикла записать остатки на диск. --------------------
- Здравствуйте, я Ваш патологоанатом |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Сдвинуть все что осталось, т.е. записать поверх той не нужной строчки, а затем обрезать размер файла до (старый размер - длинна строки).
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Sansa |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 3 Всего: 6 |
Разницы нет... Все равно 4 гига двигать
--------------------
- Здравствуйте, я Ваш патологоанатом |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Очень даже есть! Во первых не нужно создавать второй файл такого же размера, во вторых если эта строчка находиться в самом верху, например в верхних 100 Мбайтах то скопировать прийдеться всего 100 Мб а не 4Гб. В любом случае размер скопированных данных будет меньше размера всего файла, вот только размер буфера копирования следует установить 10-15 Мб, иначе головка винчестера будет слишком часто дергаться, а это самая медленная и вредная операция для винчестера. Больше размер ставить бесполезно, так как за время копирования куска большего чем 10-15 Мб операцию чтения начнут прерывать другие операции для своих файловых операций и скорость чтения не возрастет, при этом еще все будет жутко тормозить, так как дисковые операции имеют высокий приоритет. Кстати внутри файла путь головок короче. Это сообщение отредактировал(а) Alexeis - 25.6.2007, 10:39 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
dumb, ну если представить себе благоприятный случай, когда файл лежит одним блоком и все его сектора идут один за другим, то при перемещении данных внутри файла головка винчестера будет перемещаться между смежными или близкими дорожками, т.е. проходить короткий путь. Если же имеем 2 4х гигабайтных файла, расположенных в разных концах диска, то очевидно считав блок данных, для записи ей прийдеться переместиться на много дорожек вверх или вниз, чтобы записать эти данные.
Я тут где-то в разделе даже проводил тестирование на чтение с перезаписью больших файлов, где было видно что при перемещении данных маленьким буфером скорость значительно падала, это происходило при низкой загрузке процессора исходя из чего можно было сделать вывод о том что происходит длительный простой процессора на время перемещения головок. Исходя из этих же соображений переработан стандарт SATA II.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| posta |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 20.9.2005 Репутация: нет Всего: нет |
Ребята, я все же понимаю, что тема головок была интересна ао все времена, но все давайте не удаляться от темы.. =) Можно посмотреть реальный пример того, как обрезать 4х гигабайтный файл на первую строку? И еще, разве нет такой процедуры или функции, как типо Delete [i] для строк? Вроде нет, все уже просмотрел.. |
|||
|
||||
| Sansa |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 3 Всего: 6 |
Ну, самый простой...
Но нужно буит иметь свободной памяти > чем размер файла. Плюс, быстродействие не фонтан. Второй вариант (из простых)
Памяти кушает меньше, но по времени не на много быстрее Добавлено через 3 минуты и 29 секунд Кстати, может в цикле удалять по строке необязательно? Сначала пройтись по файлу в цикле, а затем, сохранив число обработанных строк, разом удалить их из входного файла --------------------
- Здравствуйте, я Ваш патологоанатом |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Вот мой вариант удаления 1й строчки. Для файла 4,00 Гб удаление строки длинной около 500 символов заняло 1 минуту и 56 секунд.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Можешь назвать: -процессор -интерфейс на которой винт стоит + марка -система -приоритет процесса и загруженность системы И если не трудно замерь время без этой строки. На досуге попробую оптимизировать. PS: смысл? -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
W4FhLF, да в том то и дело что самые обычные. АТА100шная Баракуда 80Гб. Проц стоит семпрончик на 2500. XPSP2. Приоритет не менял. В данной ситуации проц не играет особой роли, загрузка всего ~30%.
Шутишь? она вызывается всего 2 раза в секунду Это врядли удасться, чувствую тут хорошо работала оптимизация винды или харда, потому что 35 Мбайт/с для чтения с перезаписью это слишком много, учитывая что для таких хардов реальная скорость чтения не превышает 80 МБайт/с, запись медленнее, а поскольку тут производиться 2 операции, то при скорости записи равной скорости чтения перенос шел бы со скоростью 40 МБайт/с. Добавлено через 35 секунд строчка C := C; нужна для того чтобы на нее брейк поставить -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Проц может и не играет, а планировщик ты забыл? Появится у тебя задача с большим приоритетом в момент тестирования и все результаты сразу на свалку.
Ну дело в том, что здесь постоянно дёргается графическая подсистема, поэтому результаты не совсем точные. Хотя при такой точности это будет незаметно, но однако же А с размером буфера ты играл? ПС. Как геренил файл? Это сообщение отредактировал(а) W4FhLF - 26.6.2007, 10:53 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Файловый поток в работе или как правильно выбирать буфер чтения/записи Да удлинил первый попавшийся текстовый файлик до 4х Гб. Думаю винда, что при записи не гоняла буфер назад, а брала его из кеша харда, иначе нельзя объяснить такую большую скорость... Это сообщение отредактировал(а) Alexeis - 26.6.2007, 11:03 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Да, поковырял сорец, переписал на Api, выиграл 2.4%
Кстати: http://wasm.ru/forum/viewtopic.php?id=14138 Там про файловый кэш ОС говорится немного. Это сообщение отредактировал(а) W4FhLF - 26.6.2007, 13:20 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
![]()
|
| Правила форума "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. |