LINUX.ORG.RU

Чем сейчас принято mmap'ить файлы?

 ,


0

1

Возникла странная проблема: открываю файл с PerlIO layer'ом ":mmap", делаю на нём binmode($fh), пишу туда данные CBOR-кодированные. Ну и отправлюсь в глубокий сон AE::cv->recv

Потом открываю этот файл:

use 5.16.1;
use Time::HiRes qw(time);
open my $fh, "<:mmap", "/tmp/mmap.15669";
binmode($fh);
use CBOR::XS qw(decode_cbor);
my $s=time();
my $csh3=do{local $/;<$fh>};
my $h=decode_cbor($csh3);
print (time()-$s)," sec\n"
(на самом деле это однострочник :))

И получаю:

unexpected end of CBOR data, at offset 2326528 (octet 0x00) at -e line 1, <$fh> line 1.

При этом реальный размер записанных данных - 2329390. Т.е. запинается явно не на кривом конце файла или чём-то подобном.

Отсюда возник вопрос: возможно, я как-то не так пользуюсь layer'ом?

А может, стоит использовать Sys::Mmap (говорит: permission denied при попытке открыть для mmap'а несуществующий файл в /tmp) или File::Map? Или ещё что-то...

Мне нужно просто расшарить кусок дико бинарных данных между процессами: записать его один раз, сказать всем процессам через ZMQ (раз уж IPC почему-то не в фаворе у современных программистов), что «нате, забирайте свой бинарный шит» каждый процесс возьмёт заmmap'леное содержимое чудо-файлика, decode_cbor'ит его - и будет счастье.

Но что-то не срастается нифига, не могу понять, почему :(

Any ideas?

★★★★★

Оказалось, надо было всё-таки закрыть файл после записи в него.

Почему-то несмотря на его заmmap'кеность запись оказалась буферизированной. Бред какой-то :(

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Почему бред? Это же не direct I/O

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

router ★★★★★
()
Ответ на: комментарий от router

Меня, кстати, крайне смущает то, что прямо сразу после записи в mmap'леный файл - я могу считать его cat'ом ещё до close($fh) : мне как-то всегда казалось, что mmap'леные файлы существует для того, чтобы их обновления как можно реже попадали на диск. Однако же нифига...

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Меня, кстати, крайне смущает то, что прямо сразу после записи в mmap'леный файл - я могу считать его cat'ом ещё до close($fh) : мне как-то всегда казалось, что mmap'леные файлы существует для того, чтобы их обновления как можно реже попадали на диск

А кто тебе сказал что они на диске?

slovazap ★★★★★
()
Ответ на: комментарий от DRVTiny

Меня, кстати, крайне смущает то, что прямо сразу после записи в mmap'леный файл - я могу считать его cat'ом ещё до close($fh)

Здесь нет никакой проблемы или противоречия. Обращение в любом случае пойдёт через подсистему виртуальной памяти

А если данные есть в кэше, нет смысла читать их с диска

ЕМНИП, при маппинге можно выбрать режимы. Никогда не пользовался, но может там есть то, что ты хочешь. Вроде бы можно было то ли private маппинг создать

мне как-то всегда казалось, что mmap'леные файлы существует для того, чтобы их обновления как можно реже попадали на диск

ИМХО, нет. Подробности не помню, но точно связано с подсистемой виртуальной памяти

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от iliyap

Теоретически Sys::Mmap может делать с флагом MAP_SHARED, но у меня вообще не получилось использовать Sys::Mmap, поскольку оно считало, что permission denied и не утруждало себя объяснениями, на какой такой объект ОС у меня прав не хватает.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от Casus

Там key=>value и ограничения на размер value

Мне нужно просто value, без key и без ограничений длины value.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Нету нормальных модулей под перл ;) Делай XS. А вообще я не думаю что тебе правда нужны такие оптимизиации.

OxiD ★★★★
()
Ответ на: комментарий от DRVTiny

page_size

Size of each page. Must be a power of 2 between 4k and 1024k. If not, is rounded to the nearest value.

16M мало?

ASSERT(c_page_size >= 1024 && c_page_size <= 16*1024*1024);

Можно запатчить же и на большее поди.

Casus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.