Я хочу скопировать большой файл на основе ram (находящийся в/dev/shm direcotry) на локальный диск, есть ли способ для эффективной копии вместо чтения char one by один или создать другую кусочную память? Здесь я могу использовать только C-язык. Есть ли в любом случае, что я могу поместить файл памяти прямо на диск? Благодаря!Как скопировать файл ram_base на диск эффективно
ответ
/dev/shm является общей памятью, поэтому одним из способов ее копирования было бы открыть его как разделяемую память, но, честно говоря, я не думаю, что вы что-то выиграете.
при записи вашего файла памяти на диск, узким местом будет диск. просто не забудьте написать данные в больших кусках, и все должно быть в порядке.
Вы можете просто скопировать его, как и любой другой файл:
cp /dev/shm/tmp ~/tmp
Таким образом, быстрый и простой способ, чтобы выдать команду cp
через system()
.
-1, потому что это решение с низкой производительностью и использует внешнюю программу (которая сама по себе вызывает различные проблемы) через system() (которая запускает команду с помощью оболочки, вызывая различные другие проблемы).Реализация идентичной операции копирования в C занимает всего несколько строк кода. – Tronic
Согласен с Tronic. –
@Tronic - достаточно честный; уметь размещать какой-то код? –
Я бы mmap()
файлы и делал memcpy()
между ними.
Я сомневаюсь, что это тоже хорошее качество. Он по-прежнему выполняет копирование на CPU, а в тестах MMAP имеет тенденцию быть более медленным для линейного доступа, чем другие методы. – Tronic
Это не заставляет процессор касаться памяти. Если данные уже установлены и просто должны быть написаны, я думаю, что это очень прямой способ выполнить задачу. – Potatoswatter
'memcpy()' обязательно будет включать процессор, касающийся памяти. Он не знает, что назначение - это файл с отображением памяти. – caf
Чтобы проверить, работает ли системный вызов splice
. Я не уверен, будет ли это с тех пор, как он будет иметь некоторые ограничения в отношении типов файлов, с которыми он может работать, но если он сработает, вы будете называть его неоднократно с запросами на размер страницы (или несколько раз), пока она не закончится , и ядро будет обрабатывать его очень эффективно.
Если это не сработает, вам нужно будет либо mmap, либо сделать обычный старый read
/write
. Чтение и запись на бумаге размером с страницу памяти делает вещи намного более эффективными. Это может быть еще более эффективным, если ваши буферы выравниваются по размеру страницы памяти, так как он открывает возможность для ядра просто перемещать данные в/из памяти вашего процесса с помощью обмана управления памятью, а не копировать данные.
Единственное, что вы можете сделать, это прочитать() в выровненных по строкам фрагменты страницы. Я предполагаю, что вам необходимо гарантировать, что данные будут записаны, что будет означать обход буферов через posix_fadvise() или с использованием O_DIRECT (обычно я использую posix_fadvise(), но O_DIRECT здесь подходит).
В этом случае скорость записи носителя в одиночку диктует, как быстро это произойдет.
Если вам не нужно обходить буферы, операция завершится быстрее, но нет гарантии, что данные будут фактически записаны в случае перезагрузки/отключения питания/и т. Д. Поскольку источником данных является в общей памяти я (снова) угадываю, что вы хотите, чтобы запись была гарантирована.
Единственное, что вы можете оптимизировать, это то, как долго требуется чтение() для получения данных из разделяемой памяти в ваше собственное адресное пространство, размер выравниваемых по размеру страниц будет улучшаться.
Спасибо вам, ребята, за помощь! Я сделал это с помощью mmap файла на основе ram и записал весь блок непосредственно в пункт назначения. memcopy не использовался, потому что я фактически пишу в параллельную файловую систему (pvfs), которая не поддерживает работу mmap.
- 1. Скопировать файл ресурсов csv на жесткий диск
- 2. Как скопировать объект InMemoryUploadedFile на диск
- 3. Скопировать каталог на другой диск
- 4. Как скопировать приложение ROR на локальный диск
- 5. В Python + Pylons, простой способ скопировать загруженный файл на диск
- 6. phpmyadmin - сохранить файл на диск
- 7. эффективно сохраняет файлы изображений на диск C#
- 8. Запись на жесткий диск более эффективно
- 9. Написать файл на диск
- 10. файл скорость копирования на USB прикрепленного диск
- 11. Python: Как эффективно сохранить массив 2d numpy на диск?
- 12. Загрузить файл на диск удаленно
- 13. Скопировать файл на удаленный компьютер
- 14. Попытка скопировать файл из текущего каталога F: \ диск в VBScript
- 15. Как скопировать многократные файлы с сервера на диск usb
- 16. Как скопировать файлы на внешний жесткий диск в php
- 17. Как скопировать элемент из ссылки на диск? (C#)
- 18. Как сделать этот скрипт скопировать файлы на локальный диск?
- 19. Как сохранить xml-файл на диск?
- 20. Как сохранить файл на диск в C++?
- 21. Как сохранить входной файл формы на диск?
- 22. Как загрузить зашифрованный файл на Google диск
- 23. Как загрузить файл на Google диск программно
- 24. шифрованной файл как сохраненное на диск
- 25. Как загрузить файл на google-диск api
- 26. Как написать большой двоичный файл на диск
- 27. Как загрузить файл на Google Диск
- 28. Как передать файл на жесткий диск?
- 29. C# Скопировать на диск группу файлов из ресурсов
- 30. ITHit Webdav Server - невозможно скопировать файлы на подключенный диск
Вы получите гораздо более высокую производительность, если используете более крупные блоки, чем один байт. Оптимальное решение позволит оборудованию сделать это с помощью DMA, но, к сожалению, я не знаю, можно ли это сделать на Linue. – Tronic