[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: mmap на больших файлах ?



Eugene Onischenko wrote:

Sergei Olonichev wrote:

Aleksey Cheusov wrote:

Sergei Olonichev <olonichev@scnsoft.com> writes:



Привет Всем!

Вот какой вопрос:

У меня есть файл размером больше 4G. И есть приложение которое иногда
читает этот файл по разным смещениям - как правило не более 50k.
Причем одни смещения используются значительно чаще чем другие (а
большинство возможных смещений не используется вообще).

Мне бы хотелось максимально ускорить этот процесс чтения.

Очевидно что использовать mmap на весь файл не получится.
Это почему это?


потомучто указатель как был 32 bit так и остался как __off_t не определяй
void * ptr = mmap (...);

А зачем вам больше? 32 бита вполне хватит для Ваших 50k.

Так в этом то и вопрос. Просто вызывать mmap на каждый блок (условно 50k) - это, здается мне, ни чем не лучше чем вызывать fread (с точки зрения скорости), а может еще и хуже.


Если воспользоватся mmap64 (там offset 64 бита), соответственно передаем в
последний параметр число 4 294 967 297ю Указатель который вернёт mmap64
(ptr) указывает на 4 294 967 297 байт в файле, а (char*)ptr+50000 указывает
на 4294967297+50000 байт в вашем файле.

это тоже самое что предлагал Cheusov

Тут у меня мысль появилась вот какая - я в этом файле все данные
пересортирую таким образом чтобы те блоки куда обращенее происходит чаще
всего находились вначале файла - друг за другом.
И отображать в память буду только первые N - блоков - так чтобы размер
отбражения не превосходил какою-то константу.

Работа ускорится - плохо только что будет смесь из fred и *ptr


0,~>echo '#include <sys/mman.h>' | cpp -D_FILE_OFFSET_BITS=64
-D_LARGEFILE_SOURC> typedef long int __off_t;
typedef __quad_t __loff_t;
typedef __loff_t __off64_t;
typedef __off64_t off_t;
0 0 0,~>



Есть ли
смысл использовать mmap (c точки зрения производительности) перед
непосредственным чтением определенного куска (те на ~50k) или нет?
Не перед, а вместо.










Reply to: