Как быстро создать большой файл в системе Linux ( Red Hat Linux )?
dd выполнит эту работу, но чтение /dev/zero
и запись на диск могут занять много времени, когда вам нужен файл размером в несколько сотен гигабайт для тестирования ... Если вам нужно делать это несколько раз, время действительно увеличивается.
Меня не волнует содержимое файла, я просто хочу, чтобы он был создан быстро. Как это может быть сделано?
Использование разреженного файла не будет работать для этого. Мне нужно, чтобы файл был выделен на диске.
linux
file
filesystems
DrStalker
источник
источник
df
сообщит? Тестирование приложения, которое делает что-то конкретное. Ответ зависит от того, что вы хотите проверить. Как бы то ни было, я немного опоздал - теперь я вижу, что с момента вашего вопроса прошло много лет :-)Ответы:
dd
Из других ответов это хорошее решение, но оно медленное для этой цели. В Linux (и других системах POSIX) у насfallocate
, который использует желаемое пространство без необходимости его фактической записи, очень быстро работает с большинством современных дисковых файловых систем:Например:
источник
fallocate
это именно то, что я искал.fallocate
) также не будет работать в файловой системе ZFS в Linux - github.com/zfsonlinux/zfs/issues/326fallocate
является частьюutil-linux
пакета. Этот инструмент был написан Карелом Зака из RedHat и исходный код можно найти здесь: kernel.org/pub/linux/utils/util-linuxЭто общий вопрос, особенно в современной среде виртуальных сред. К сожалению, ответ не так прост, как можно предположить.
dd - очевидный первый выбор, но dd по сути является копией, и это заставляет вас записывать каждый блок данных (таким образом, инициализируя содержимое файла) ... И эта инициализация занимает столько времени ввода-вывода. (Хотите, чтобы это заняло еще больше времени? Используйте / dev / random вместо / dev / zero ! Тогда вы будете использовать процессор, а также время ввода-вывода!) В конце концов, dd - плохой выбор (хотя по сути по умолчанию используется ВМ "создать" GUI). Например:
truncate - это другой выбор - и, вероятно, самый быстрый ... Но это потому, что он создает «разреженный файл». По сути, разреженный файл - это раздел диска, который содержит много одинаковых данных, и лежащая в основе файловая система «обманывает», на самом деле не сохраняя все данные, а просто «делая вид», что все это есть. Таким образом, когда вы используете усечение для создания 20 ГБ диска для вашей виртуальной машины, файловая система фактически не выделяет 20 ГБ, но обманывает и говорит, что там есть 20 ГБ нулей, хотя всего одна дорожка на диске может фактически (действительно) использоваться. Например:
fallocate является окончательным - и лучший - выбор для использования с выделением диска VM, потому что она по существу «резервы» (или «выделяет» все пространства вы ищете, но это не мешает писать что - либо так,. когда вы используете Fallocate для создания виртуального дискового пространства объемом 20 ГБ, вы действительно получаете файл размером 20 ГБ (а не «разреженный файл»), и вам не нужно будет ничего записывать в него - это означает, что практически все может быть в там - вроде как новый диск!) Например:
источник
truncate
работает на JFS;fallocate
, не так много. Одно замечание: вы не можете включить десятичное число в число, я должен был указать1536G
, нет1.5T
.fallocate
странице человека, это поддерживается толькоbtrfs
,ext4
,ocfs2
иxfs
файловые системыswapon
к сожалению, не работает с предварительно выделенными экстентами, последний раз я проверял. В списке рассылки XFS было несколько обсуждений о наличии опции fallocate, чтобы вместо этого показывать старые данные о свободном пространстве, а не иметь экстент, помеченный как предварительно выделенный, поэтому swapon будет работать. Но я не думаю, что что-то когда-либо было сделано./dev/random
может привести к исчерпанию случайных данных, и «Когда пул энтропии пуст, чтение из / dev / random будет блокироваться до тех пор, пока не будет собран дополнительный шум окружающей среды», так что это может занять очень очень очень долгое времяLinux и все файловые системы
xfs_mkfile 10240m 10Gigfile
Linux & и некоторые файловые системы (ext4, xfs, btrfs и ocfs2)
fallocate -l 10G 10Gigfile
OS X, Solaris, SunOS и, возможно, другие UNIX
mkfile 10240m 10Gigfile
HP-UX
prealloc 10Gigfile 10737418240
объяснение
Попробуйте
mkfile <size>
myfile в качестве альтернативыdd
. С помощью-n
опции размер указывается, но дисковые блоки не выделяются до тех пор, пока в них не будут записаны данные. Без-n
опции пространство заполняется нулями, что означает запись на диск, что означает, что нужно время.mkfile является производным от SunOS и доступен не везде. Большинство систем Linux
xfs_mkfile
работают точно так же, и не только в файловых системах XFS, несмотря на название. Он включен в xfsprogs (для Debian / Ubuntu) или аналогичные именованные пакеты.Большинство систем Linux также имеют
fallocate
, которая работает только на определенных файловых системах (таких как btrfs, ext4, ocfs2 и xfs), но является самой быстрой, поскольку она выделяет все файловое пространство (создает файлы без дыр), но не инициализирует какие-либо этогоисточник
mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
xfs_mkfile
входит в xfsprogs на Ubuntu и работает как шарм на моей ext3 fs. :)создаст файл размером 10 М мгновенно (M означает 1024 * 1024 байта, MB означает 1000 * 1000 - то же самое с K, KB, G, GB ...)
РЕДАКТИРОВАТЬ: как многие отмечали, это не будет физически распределять файл на вашем устройстве. При этом вы можете создать произвольный большой файл независимо от доступного места на устройстве, поскольку он создает «разреженный» файл.
Таким образом, при этом вы будете откладывать физическое распределение до получения доступа к файлу. Если вы отображаете этот файл в память, у вас может не быть ожидаемой производительности.
Но это все еще полезная команда, чтобы знать,
источник
fallocate
ответ ниже делает.Где искать - это размер файла, который вы хотите в байтах - 1.
источник
truncate
кажется, намного лучше.Примеры, где искать это размер файла, который вы хотите в байтах
Из справочной страницы дд:
источник
truncate
.Чтобы сделать файл размером 1 ГБ:
источник
dd if=/dev/zero of=filename bs=20G count=1
создаст только 2ГБ файл! не 20 ГБ.Я не очень много знаю о Linux, но вот код C, который я написал, чтобы подделать огромные файлы на DC Share много лет назад.
источник
Вы также можете использовать команду «да». Синтаксис довольно прост:
Нажмите «Ctrl + C», чтобы остановить это, иначе он съест все ваше доступное пространство.
Для очистки этого файла запустите:
очистит этот файл.
источник
Я не думаю, что вы получите намного быстрее, чем дд. Узким местом является диск; запись сотен гигабайт данных займет много времени, независимо от того, как вы это делаете.
Но вот возможность, которая может работать для вашего приложения. Если вас не волнует содержимое файла, как насчет создания «виртуального» файла, содержимое которого является динамическим выводом программы? Вместо открытия () файла, используйте popen (), чтобы открыть канал для внешней программы. Внешняя программа генерирует данные всякий раз, когда это необходимо. Когда канал открыт, он действует как обычный файл, поскольку программа, открывшая канал, может использовать fseek (), rewind () и т. Д. Вам нужно будет использовать pclose () вместо close (), когда вы сделано с трубой.
Если вашему приложению нужен файл определенного размера, то внешняя программа сможет отследить, где он находится в «файле», и отправить eof, когда достигнут «конец».
источник
Один из подходов: если вы можете гарантировать, что несвязанные приложения не будут использовать файлы конфликтующим образом, просто создайте пул файлов разного размера в определенном каталоге, а затем создайте ссылки на них при необходимости.
Например, есть пул файлов с именем:
Затем, если у вас есть приложение, которому нужен файл 1G с именем / home / oracle / logfile, выполните «
ln /home/bigfiles/1024M-A /home/oracle/logfile
».Если он находится в отдельной файловой системе, вам придется использовать символическую ссылку.
Файлы A / B / etc могут использоваться для предотвращения конфликтного использования между несвязанными приложениями.
Операция со ссылками идет так быстро, как вы можете получить.
источник
GPL-файл mkfile - это просто (ba) sh скрипт-оболочка для dd; Mkfile из BSD просто устанавливает буфер с ненулевым значением и записывает его повторно. Я не ожидал бы, что первый превзойдет дд. Последний может слегка вытеснить dd, если = / dev / zero, так как он пропускает чтение, но все, что значительно лучше, вероятно, просто создает разреженный файл.
При отсутствии системного вызова, который фактически выделяет пространство для файла без записи данных (а в Linux и BSD этого нет, возможно, и в Solaris), вы можете получить небольшое улучшение производительности, используя ftrunc (2) / truncate (1) для расширения файла до нужного размера mmap файл в память, затем запись ненулевых данных в первые байты каждого блока диска (используйте fgetconf, чтобы найти размер блока диска).
источник
Бесстыдный плагин: OTFFS предоставляет файловую систему, предоставляющую произвольно большие (ну, почти. Exabytes - текущий предел) файлы сгенерированного контента. Это только для Linux, обычный C и ранняя альфа.
Смотрите https://github.com/s5k6/otffs .
источник
Это самое быстрое, что я мог сделать (что не быстро) со следующими ограничениями:
fallocate
недоступно)Это суть этого ...
В нашем случае это для встроенной системы Linux, и она работает достаточно хорошо, но предпочла бы что-то быстрее.
К вашему сведению, команда
dd if=/dev/urandom of=outputfile bs=1024 count = XX
была настолько медленной, что ее нельзя было использовать.источник