Как эффективно скопировать файл ram_base на диск - PullRequest
2 голосов
/ 03 апреля 2010

Я хочу скопировать большой файл на базе оперативной памяти (расположенный в / dev / shm direcotry) на локальный диск, есть ли способ создать эффективную копию вместо чтения символа по одному или создать еще один фрагмент памяти? Я могу использовать только язык Си здесь. В любом случае, я могу поместить файл памяти прямо на диск? Спасибо!

Ответы [ 6 ]

2 голосов
/ 03 апреля 2010

Я бы mmap() файлы и сделать memcpy() между ними.

1 голос
/ 05 апреля 2010

Спасибо вам, ребята, за помощь! Я сделал это с помощью mmap, основанного на оперативной памяти, и записал весь блок непосредственно в место назначения. memcopy не использовался, потому что я на самом деле пишу в параллельную файловую систему (pvfs), которая не поддерживает операцию mmap.

0 голосов
/ 04 апреля 2010

Единственное, что вы можете сделать, это прочитать () в кусках, выровненных по размеру страницы. Я предполагаю, что вам нужно гарантировать, что данные записаны, что будет означать обход буферов через posix_fadvise () или использование O_DIRECT (я обычно использую posix_fadvise (), но здесь уместно использовать O_DIRECT).

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

Если вам не нужно обходить буферы, операция завершится быстрее, но нет никакой гарантии, что данные будут действительно записаны в случае перезагрузки / отключения питания / и т. Д. Так как источник данных находится в разделяемая память, я (опять же) предполагаю, что вы хотите, чтобы запись была гарантирована.

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

0 голосов
/ 04 апреля 2010

Вы можете попытаться проверить, работает ли системный вызов splice для этого. Я не уверен, что так и будет, так как у него есть некоторые ограничения относительно типов файлов, с которыми он может работать, но если бы он работал, вы бы неоднократно вызывали его с размерами страниц памяти (или с несколькими размерами страниц), пока он не закончил и ядро ​​справится с этим очень эффективно.

Если это не сработает, вам нужно выполнить mmap или просто старый read / write. Чтение и запись в кусках памяти размером с страницу делает вещи намного более эффективными. Это может быть еще более эффективно, если ваши буферы выровнены по размеру страницы памяти, так как это открывает ядру возможность просто перемещать данные в / из памяти вашего процесса с помощью хитрости управления памятью, а не копировать данные.

0 голосов
/ 03 апреля 2010

Вы можете просто скопировать его как любой другой файл:

cp /dev/shm/tmp ~/tmp

Итак, быстрый и простой способ - ввести команду cp через system().

0 голосов
/ 03 апреля 2010

/ dev / shm является разделяемой памятью, поэтому один из способов скопировать ее - открыть ее как разделяемую память, но, честно говоря, я не думаю, что вы получите что-либо.

при записи файла памяти на диск узким местом будет диск. просто обязательно пишите данные большими порциями, и у вас все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...