Страниц: [1]
  Печать  
Автор Тема: Как оперировать с ну уж очень большим файлом?  (Прочитано 6490 раз)
ZZZ
Участник
*
Offline Offline

Сообщений: 12


Просмотр профиля
« : Сентября 05, 2006, 12:55:45 pm »

QNX 6.3.0 sp2

Имеется текстовый файл, размер которого не позволяет запихнуть его в память тупым realloc'ом. Файл состоит из записей, отсортированных по некоему счётчику (для простоты - по времени выполнения записи, что является первым полем каждой записи). Есть слайдер, отражающий этот файл - по перемещению каретки необходимо вычитать текущую запись (понятно, что это будет примерно необходимая запись, более точно потом перемещаемся другими средствами. Это уже не суть важно...).

Если бы можно было бы ограничиться только Pt_SLIDER_REALIZED, то ИМХО достаточно было бы простого fseek() для быстрого доступа к плюс-минус нужному фрагменту файла. Однако при необходимости обработки Pt_SLIDER_DRAGGED эта идея уже не кажется столь соблазнительной.

Есть ли разумная альтернатива? Кэширование, хэширование, ещё какие-то умные слова?

Спасибо прочитавшим, большое - ответившим. С уважением, ZZZ
Записан

С уважением, ZZZ
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Сентября 05, 2006, 02:35:18 pm »

ZZZ
Pt_SLIDER_REALIZED

Pt_SLIDER_RELEASED
ZZZ
Однако при необходимости обработки Pt_SLIDER_DRAGGED эта идея уже не кажется столь соблазнительной.


Необходимо отображать только одну, две первые записи во время таскания ползунка. Взводить таймер на очень малое время, если за это время не пришло новое событие для перемещения - отрисовывать всё остальное. Если пришло событие перемещения, то позиционируемся на новое место и опять к началу алгоритма.

В идеале, конечно, отрисовка в другом потоке, этому потоку просто передается что, где и сколько отрисовывать, если пришло новое событие, то даем этому другому потоку новое задание, отменяя старое.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #2 : Сентября 05, 2006, 02:37:52 pm »

Ну а для быстрого и точного позиционирования по файлу, если записи не имеют постоянного размера, строим индекс, и уже работаем с индексом (его также можно грузить не весь в память).
Записан

ZZZ
Участник
*
Offline Offline

Сообщений: 12


Просмотр профиля
« Ответ #3 : Сентября 05, 2006, 03:25:25 pm »

Да проблема не в том, что отрисовка отстаёт (хотя и в этом), а в том, что эти [autocensored] юзеры, обнаружив, что при движении слайдера картинка дивно меняется, начинают играться в калейдоскоп, быстро шуруя кареткой (хм. Сам такой).
В результате винчестер мучаем. Не могу придумать, как бы волков накормить, а овец уберечь.Чтобы не на каждое движение винчестер колебать. Заколебаем ведь.

Что значит индексировать файл? Номер записи - позиция в sream'е, или что Вы имеете ввиду?

С уважением, ZZZ
Записан

С уважением, ZZZ
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Сентября 05, 2006, 03:53:05 pm »

ZZZ
Не могу придумать, как бы волков накормить, а овец уберечь.Чтобы не на каждое движение винчестер колебать. Заколебаем ведь.

Тогда отрисовывать полностью, чтобы движение слайдера не доставляла удовольствия.
ZZZ
Что значит индексировать файл? Номер записи - позиция в sream'е, или что Вы имеете ввиду?

Именно, но только если размер записей плавающий.
Записан

ZZZ
Участник
*
Offline Offline

Сообщений: 12


Просмотр профиля
« Ответ #5 : Сентября 05, 2006, 04:36:32 pm »

Плавающий, ещё как. Как утка.
Да, видимо, так сделать и придётся. Таблица индексов вроде должна в память влезть.
Конечно, появляется пауза - время считывания файла+формирование таблицы, ну да ведь чудес, увы, не бывает.
Спасибо.

С уважением, ZZZ
Записан

С уважением, ZZZ
Страниц: [1]
  Печать  
 
Перейти в: