2010-04-03 3 views
2

Я хочу скопировать большой файл на основе ram (находящийся в/dev/shm direcotry) на локальный диск, есть ли способ для эффективной копии вместо чтения char one by один или создать другую кусочную память? Здесь я могу использовать только C-язык. Есть ли в любом случае, что я могу поместить файл памяти прямо на диск? Благодаря!Как скопировать файл ram_base на диск эффективно

+0

Вы получите гораздо более высокую производительность, если используете более крупные блоки, чем один байт. Оптимальное решение позволит оборудованию сделать это с помощью DMA, но, к сожалению, я не знаю, можно ли это сделать на Linue. – Tronic

ответ

0

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

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

0

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

cp /dev/shm/tmp ~/tmp 

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

+0

-1, потому что это решение с низкой производительностью и использует внешнюю программу (которая сама по себе вызывает различные проблемы) через system() (которая запускает команду с помощью оболочки, вызывая различные другие проблемы).Реализация идентичной операции копирования в C занимает всего несколько строк кода. – Tronic

+0

Согласен с Tronic. –

+0

@Tronic - достаточно честный; уметь размещать какой-то код? –

2

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

+0

Я сомневаюсь, что это тоже хорошее качество. Он по-прежнему выполняет копирование на CPU, а в тестах MMAP имеет тенденцию быть более медленным для линейного доступа, чем другие методы. – Tronic

+1

Это не заставляет процессор касаться памяти. Если данные уже установлены и просто должны быть написаны, я думаю, что это очень прямой способ выполнить задачу. – Potatoswatter

+0

'memcpy()' обязательно будет включать процессор, касающийся памяти. Он не знает, что назначение - это файл с отображением памяти. – caf

0

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

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

0

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

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

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

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

1

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

Смежные вопросы