| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Сокращение файла |
| Автор: Budy 13.9.2007, 16:54 |
| Добро пожаловать в данную тему Изложу суть проблемы. Каждый день некая программа ведет лог-файл по своим операциям. Чем больше пользователей, тем больше операций, тем больше лог. Лог-файл за день вырастает до 1-2 Гб. Известно, что каждая операция занимает N символов. Каждая из разделяется по типам (удаление, добавление, изменение). Написал программу, которая удаляет лишние операции, путем отбора и сохраняет их в другой файл. Данная процедура занимает много времени (20-30 минут), так как работа происходит по сети, а необходимо ускорить процесс. Нужно написать программу, которая будет работать прямо с лог-файлом - удалять куски данных. Наглядный пример: в файле записаны операции АБВББААВБВАБ. Нужно удалить все операции А и Б и оставить остальное. Надеюсь идею передал верно Пробовал искать в разных источниках - книги, форумы, везде говорится, что это не возможно. Однако есть надежда, что кто-нибудь знает как это сделать, или хотя бы оптимизировать (ускорить) процесс. Заранее всем спасибо за помощь |
| Автор: bems 13.9.2007, 17:33 |
| сразу веди лог в виде кучи файлов ограниченного размера. тогда если удаляется большой кусок, то бОльшую часть можно сделать как удаление файла целиком. Будет ьыстрее. Или используй БД |
| Автор: Budy 13.9.2007, 18:13 | ||
_hunter, насчет единственного способа, я именно так и делал, но занимает слишком много времени. Админ меня не пускает на сервер, где лежат логи, а по сети получается очень долго, потому что сетка постоянно занята.
Сейчас просматривал логи и заметил такой приятный парадокс - ненужные операции в основном идут в начале и в конце лога, а нужные примерно посередине. А если в процентах, то в основном 20-40% в начале и около 30% в конце. Задача упрощается - можно ли подрезать файл не посередине, а с краев? Тогда лог можно было сократить в 2-3 раза! |
| Автор: bems 13.9.2007, 18:19 |
| обрезать конец можно с помощью SetEndOfFile |
| Автор: Budy 13.9.2007, 18:32 |
| bems, да это полезно, спасибо... А можно сделать что-нибудь с началом файла? |
| Автор: bems 13.9.2007, 18:40 |
| с началом все так же как с серединой |
| Автор: Snowy 13.9.2007, 18:53 |
| Не перетаскивая файл к себе, ты не узнаешь его содержимого и не сможешь определить, что вырезать, а что нет. Так что оптимальный вариант - производить работу с файлом на сервере. Если админу больше нравится нагрузка сети, то проблемы у вас обоих. |
| Автор: Budy 14.9.2007, 06:58 |
| bems, понятно, спасибо на этом Snowy, ты прав, проблемы у нас обоих, но он этого не понимает :-\ |
| Автор: Alexeis 14.9.2007, 09:12 |
| Ребята, а разве не для этих целей придумали БД? БД производит произвольный доступ к любой записи и позволяет удалить или добавить запись за время не зависящее от размеров (или почти независящее) самой базы. |
| Автор: Budy 14.9.2007, 12:18 |
| Alexeis, согласен, БД рулит, но так получилась что программа не может вести лог сразу в БД. А вообще я уже оптимизировал свою программку - отрезаю конец файла и получаю файл размером около 60% от исходного. Теперь временные затраты уменьшаются в два с половиной раза. Радостно Всем спасибо за участие. |