Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Сокращение файла


Автор: Budy 13.9.2007, 16:54
Добро пожаловать в данную тему

Изложу суть проблемы. Каждый день некая программа ведет лог-файл по своим операциям. Чем больше пользователей, тем больше операций, тем больше лог. Лог-файл за день вырастает до 1-2 Гб. Известно, что каждая операция занимает N символов. Каждая из разделяется по типам (удаление, добавление, изменение).
Написал программу, которая удаляет лишние операции, путем отбора и сохраняет их в другой файл. Данная процедура занимает много времени (20-30 минут), так как работа происходит по сети, а необходимо ускорить процесс.
Нужно написать программу, которая будет работать прямо с лог-файлом - удалять куски данных.

Наглядный пример: в файле записаны операции АБВББААВБВАБ. Нужно удалить все операции А и Б и оставить остальное.
Надеюсь идею передал верно smile

Пробовал искать в разных источниках - книги, форумы, везде говорится, что это не возможно. Однако есть надежда, что кто-нибудь знает как это сделать, или хотя бы оптимизировать (ускорить) процесс.

Заранее всем спасибо за помощь

Автор: _hunter 13.9.2007, 17:21
Цитата(Budy @  13.9.2007,  16:54 Найти цитируемый пост)
Пробовал искать в разных источниках - книги, форумы, везде говорится, что это не возможно

не совсем понятно что понимается под "это". -- если ищется способ одной (системной) функцией удалить кусок файла (типа DeleteFilePiece(path, startPosition, endPosition)) то такой функции действительно нет.
единственный способо удалить из файла кусок данных -- это создать новый файл и перенести туда все, кроме удаляемой инфы. и перезаписать этим файлом текущий файл. возможны так же вариации с подчитыванием куска файла в память и перезаписи этим куском затираемые данные, но большого прироста производительности это не даст...

Автор: bems 13.9.2007, 17:33
сразу веди лог в виде кучи файлов ограниченного размера. тогда если удаляется большой кусок, то бОльшую часть можно сделать как удаление файла целиком. Будет ьыстрее. Или используй БД

Автор: Budy 13.9.2007, 18:13
_hunter, насчет единственного способа, я именно так и делал, но занимает слишком много времени. Админ меня не пускает на сервер, где лежат логи, а по сети получается очень долго, потому что сетка постоянно занята.
Цитата
не совсем понятно что понимается под "это". -- если ищется способ одной (системной) функцией удалить кусок файла (типа DeleteFilePiece(path, startPosition, endPosition)) то такой функции действительно нет.


Сейчас просматривал логи и заметил такой приятный парадокс - ненужные операции в основном идут в начале и в конце лога, а нужные примерно посередине. А если в процентах, то в основном 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% от исходного. Теперь временные затраты уменьшаются в два с половиной раза. Радостно smile

Всем спасибо за участие.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)