Я работаю над программой, которая должна работать в дистрибутиве Linux с файловой системой ext2. Эта программа будет записывать файлы, которые могут стать очень большими. Я заметил, что ext2 имеет максимальный размер файла от 16 до 64 ГБ. Однако одна вещь на странице википедии, которая меня несколько напугала, - это следующая строка:
Есть также много программ пользовательского пространства, которые не могут обрабатывать файлы размером более 2 ГБ.
... когда речь идет об ограничениях ext2. Означает ли это, что я должен быть осторожен с размером файла более 2 ГБ?
Вы обнаружите, что некоторые программы используют fseek для перемещения по файлу.
int fseek ( FILE * stream, long int offset, int origin );
Если они делают что-то относительно начала файла (SEEK_SET для параметра origin), тогда они имеют только 32-битное целое число со знаком в качестве параметра смещения, поэтому они могут получить только 2 гигабайта в файл.
Для программ, которые не используют fseek / ftell (например, программа, которая просто читает весь файл в линейном режиме), и для программ, которые просто используют fseek для небольшого перехода назад и вперед от текущей позиции (SEEK_CUR со смещениями <2G), проблем нет, все будет работать нормально, независимо от размера файла. Проблемы могут возникнуть только у программ, которые произвольно обращаются к данным файла.
Обратите внимание, что в некоторых средах есть функции «fseek64» и «ftell64», которые дают вызывающему 64-битное целое число со знаком и, таким образом, доступ ко всему, что они хотят.
Ограничение размера файла очень зависит от размера блока вашей файловой системы. Ограничение на один файл составляет 16 ГБ, если у вас размер блока 1 КБ, 256 ГБ для 2 КБ и 4 ТБ для 4K. Вы можете проверить размер своего блока, используя:
mojo-jojo david% sudo tune2fs -l /dev/sda1 | grep "Block size"
Block size: 4096
Это на разделе ext3, но у них будут те же ограничения. Я был бы очень удивлен, если бы у вас был раздел размером блока 1 КБ, и поэтому вам не нужно беспокоиться о файловой системе.
При этом некоторые программы не имеют поддержки больших файлов (более 2 ГБ), но я не видел ни одного в течение очень долгого времени. Последним, что я видел, был jsvc commons-java, который упал, когда его файл журнала стал больше 2 ГБ. Практически все, что написано за последние 6 лет, будет работать, если только кто-то не сделает что-нибудь странное.
У меня никогда не было проблем, и мои системные журналы обычно превышают 2 гигабайта на некоторых из моих серверов с внешними IP-адресами (журналы меняются еженедельно, а не по размеру). Я также запускаю несколько массивных каналов, которые производят файлы размером 3-6 гигабайт, и у меня тоже не было проблем с ними.
Я бы сказал, что это полностью зависит от того, какие пользовательские программы вам нужны: если есть нарушение условий сделки, вам может потребоваться переоценка.
Ограничение в 2 ГБ происходит от 32-разрядного размера ssize_t / size_t / off_t в старых системах. Это порт спецификации POSIX и не имеет особого отношения к ext2.
Как упоминается в комментарии выше, вы можете скомпилировать свое приложение с флагом «_FILE_OFFSET_BITS = 64», чтобы эти типы имели размер 64-бит.