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

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



Sergei Olonichev wrote:

> Aleksey Cheusov wrote:
> 
>>Sergei Olonichev <olonichev@scnsoft.com> writes:
>>
>>  
>>
>>>Привет Всем!
>>>
>>>Вот какой вопрос:
>>>
>>>У меня есть файл размером больше 4G. И есть приложение которое иногда
>>>читает этот файл по разным смещениям - как правило не более 50k.
>>>Причем одни смещения используются значительно чаще чем другие (а
>>>большинство возможных смещений не используется вообще).
>>>
>>>Мне бы хотелось максимально ускорить этот процесс чтения.
>>>
>>>Очевидно что использовать mmap на весь файл не получится.
>>>    
>>>
>>Это почему это?
>>  
>>
> 
> потомучто указатель как был 32 bit так и остался как __off_t не определяй
> void * ptr = mmap (...);

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

> 
> 
> Тут у меня мысль появилась вот какая - я в этом файле все данные
> пересортирую таким образом чтобы те блоки куда обращенее происходит чаще
> всего находились вначале файла - друг за другом.
> И отображать в память буду только первые 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: