каково соотношение между шириной указателя файла и максимальным размером файла - PullRequest
3 голосов
/ 08 февраля 2011

Любопытно, что ограничение максимального размера файла , предоставляемое некоторыми популярными файловыми системами в Linux, я видел, что некоторые из них имеют размер до ТБ.

Мой вопрос: что, если указатель файлаимеет ширину 32 бита, как и большинство Linux, с которыми мы сталкиваемся сегодня, не означает ли это, что максимальное расстояние, на которое мы можем обратиться, составляет 2 ^ 32-1 байт?Тогда как мы можем сохранить файл размером более 4 ГБ?

Кроме того, даже если мы можем сохранить такой файл, как мы можем найти позицию за пределами диапазона 2 ^ 32?

Ответы [ 6 ]

4 голосов
/ 08 февраля 2011

Чтобы использовать файлы размером более 4 ГБ, вам нужна «поддержка больших файлов» (LFS) в Linux.Одно из изменений, внесенных LFS, заключается в том, что смещения файлов представляют собой 64-битные числа.Это не зависит от того, работает ли сам Linux в 32- или 64-битном режиме (например, x86 против x86-64).См., Например, http://www.suse.de/~aj/linux_lfs.html

LFS была представлена ​​в основном в glibc 2.2 и ядре 2.4.0 (примерно в 2000-2001 гг.), Так что любой недавний дистрибутив Linux будет иметь его.

Чтобы использовать его в Linux, вы можете использовать специальные функции (например, lseek64 вместо lseek) или установить #define _FILE_OFFSET_BITS 64, тогда обычные функции будут использовать 64-битные смещения.

1 голос
/ 08 февраля 2011

Нет никакого отношения вообще.Указатель FILE * из C stdio - это непрозрачный дескриптор, который не имеет отношения к размеру файла на диске, и объем памяти, на который он указывает, может быть намного больше, чем сам указатель.Функция fseek(), чтобы изменить положение, из которого мы читаем и записываем, уже занимает long, а fgetpos() и fsetpos() используют непрозрачные fpos_t.

Что может сделать работу с большимиФайлы трудные off_t используются в качестве смещения при различных системных вызовах.К счастью, люди поняли, что это будет проблемой, и придумали «Поддержка больших файлов» (LFS), которая представляет собой измененный ABI с более широкой шириной для типа смещения off_t.(Обычно это делается путем введения нового API и #define использования старых имен для вызова этого нового API.)

1 голос
/ 08 февраля 2011

В Linux, по крайней мере, тривиально писать программы для явной работы с большими файлами (т. Е. Не просто с использованием потокового подхода, как предлагает kohlehydrat).

См. эту страницу , например.Уловка обычно сводится к магии #define перед включением некоторых системных заголовков, которые «включают» «поддержку больших файлов».Это обычно удваивает размер типа смещения файла до 64 бит, что довольно много.

0 голосов
/ 08 февраля 2011

Вы можете использовать lseek64 для обработки больших файлов.Ext4 может обрабатывать 16 файлов TiB.

0 голосов
/ 08 февраля 2011

UNIX имеет фактические физические ограничения на размер файла, определяемые количеством байтов, которые может индексировать 32-битный указатель файла, около 2,4 ГБ.

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

Причиной некоторых ограничений файловой системы ext2 являются формат файла данных и ядро ​​операционной системы. В основном эти факторы будут определены один раз при сборке файловой системы. Они зависят от размера блока и соотношения количества блоков и инодов. В Linux размер блока ограничен архитектурой размер страницы .

Есть также некоторые пользовательские программы, которые не могут обрабатывать файлы размером более 2 ГБ .

Максимальный размер файла ограничен min( (b/4)3+(b/4)2+b/4+12, 232*b ) из-за i_block (an array of EXT2_N_BLOCKS) и i_blocks( 32-bits integer value ), представляющих количество b-байтовых "блоков" в файле.

0 голосов
/ 08 февраля 2011

Просто позвоните несколько раз read(int fd, void *buf, size_t count);

(Таким образом, указатель на файл не требуется).

С точки зрения разработки файловой системы, вы в основном имеете дерево индексов (Inodes), которое указывает на несколько частей этих данных (блоков), которые образуют фактический файл. Используя эту модель, теоретически вы можете иметь размер файла infinte.

...