Как я понял, «разреженный файл» означает, что файл может иметь «пробелы», поэтому фактически используемые данные могут быть меньше, чем логический размер файла.
Как файловые системы Linux сохраняют файлы на диске? Я в основном заинтересован в ext4. Но:
- Можно ли сохранить файл не последовательно на диске? Под этим я подразумеваю, что часть файла расположена по физическому адресу X, а следующая часть - по физическому адресу Y, который не близок к смещению X +).
- Можно ли как-то контролировать последовательность файлов?
Я хочу выделить файл 10 ГБ. Я хочу, чтобы он был последовательным на диске и не распределялся между разными смещениями. - Это действует по-разному между различными типами?
linux
filesystems
hard-disk
io
hudac
источник
источник
dmsetup
программа, интерфейс для отображения устройств. Это может быть хорошим выбором, если вы планируете хранилище в виде базы данных.iso9660
иromfs
неспособны сделать это и требуют постоянного хранения (из них я могу перечислить вне головы).Ответы:
Да; это известно как фрагментация файла и не редкость, особенно для больших файлов. Большинство файловых систем выделяют пространство по мере необходимости, более или менее последовательно, но они не могут угадать будущее поведение - поэтому, если вы записываете 200 МБ в файл, а затем добавляете дополнительные 100 МБ, существует ненулевая вероятность того, что оба набора данных будут храниться в разных областях диска (в основном, любая другая запись, требующая больше места на диске, происходящая после первой записи и перед второй, может оказаться между ними). Если файловая система близка к полному, ситуация обычно будет хуже: может не быть смежной области свободного пространства, достаточно большой для размещения нового файла, поэтому ее придется фрагментировать.
Вы можете сообщить файловой системе о целевом размере вашего файла при его создании; это поможет файловой системе оптимально хранить ее. Многие современные файловые системы используют метод, известный как отложенное размещение, при котором макет нового файла на диске рассчитывается как можно позже, чтобы максимизировать доступную информацию при выполнении вычисления. Вы можете помочь этому процессу, используя
posix_fallocate(3)
функцию, чтобы сообщить файловой системе, сколько дискового пространства должно быть выделено в общей сложности. Современные файловые системы будут пытаться выполнить это распределение последовательно.Разные файловые системы ведут себя по-разному, да. Файловые системы на основе журналов, такие как NILFS2, не распределяют хранилище так же, как файловые системы на основе экстентов, такие как Ext4, и это только один из вариантов вариаций.
источник
fallocate(3)
обеспечить последовательность файлов? или просто намекает на файловую систему? Я не могу полностью понять это на страницах руководства.Команда
filefrag
расскажет вам, как ваш файл физически хранится на вашем устройстве:Если вы напишите свой файл за один проход, я предполагаю, что ваш файл не будет фрагментирован.
Страница справочника
fallocate
(1) довольно понятна:Это последовательно? Система сначала попытается распределить блоки последовательно. Если он не может, он не предупредит вас.
источник
ext4
.filefrag
скрыт в/usr/sbin
. Но это похоже на работу для обычных пользователей (по крайней мере, на ext4). Дляstrace
его работы может быть полезно посмотреть, как измерить фрагментацию для себя, если отсутствие предупреждения является помехой для вас.Вы упоминаете разреженные файлы, и ни один из других ответов не упомянул их.
Большинство файлов не редки. Самый распространенный способ создания файла - это написать все сразу, от начала до конца. Там нет дыр.
Тем не менее, вы можете сказать «переместиться на позицию 1,000,000,000,000 и записать там байт». Это создаст файл, который выглядит так, как будто он имеет большой размер в etabyte, но на самом деле использует только (вероятно) 4 КБ на диске. Это редкий файл.
Вы можете делать это много раз для одного и того же файла, оставляя небольшие объемы данных, разбросанные по огромной пустоте.
Хотя это может быть полезно, есть два недостатка.
Во-первых, файл будет фрагментирован, о чем вы и беспокоитесь.
Во-вторых, не все программы хорошо справляются с этими файлами. Например, какое-то программное обеспечение для резервного копирования попытается создать резервную копию пустого пространства и, таким образом, создать резервную копию, размер которой намного больше необходимого, возможно, слишком велик для носителя резервного копирования.
источник
Есть по крайней мере несколько способов добиться этого.
Используйте файловую систему с большим количеством свободного места и предварительно выделите пространство (например, используйте специфичный для приложения маркер конца данных и добавляйте случайные данные, пока размер файла не достигнет 10 ГБ). Это не гарантирует получение нефрагментированных данных.
Используйте сырую (сырую) файловую систему вместо ext4 и т. Д. СУБД иногда делают это по соображениям производительности. Компромисс заключается в том, что вы должны сделать свое собственное кэширование / журналирование / восстановление и т.д., если это необходимо.
Случаи, когда вы получаете большую выгоду от этого, относительно редки - я бы сначала посмотрел в другом месте, чтобы оптимизировать производительность.
Смотрите также
Правда ли, что системы управления базами данных обычно обходят файловые системы?
источник
Если это одноразовая вещь и не важно, как файл хранится изначально, важен только результат, тогда вы можете просто сохранить файл как обычно и запустить дефрагментатор вашей операционной системы. Затем вы можете проверить с помощью этого ответа, если ваш файл в одной части, если нет, повторите. Это самый простой способ сделать это, без использования команд или внешних программ, но это, безусловно, не самый быстрый способ, потому что он дефрагментирует весь ваш диск.
источник
aptitude search ~ddefrag
былиddrescueview
иnids
сегмент TCP повторной сборки библиотеки. Ваш ответ не очень полезен, если вы не говорите, как называется программа или какие аргументы необходимо передать.