Я пытаюсь прочитать определенные блоки данных (около 4096 байт) из (возможно) огромного файла.
Используя Ada.Streams.Stream_IO.Read()
с компилятором GNAT, какое максимальное смещение я мог бы использовать? То есть, если бы я хотел прочитать последние 4 килобайта файла, используя
type Block_Array is array (1..4096) of Positive;
...
Ada.Streams.Stream_IO.Read(File, Block_Array, Last, Offset);
насколько большим может быть смещение (и, следовательно, файл)?
Проведя небольшое исследование, Offset
похоже, что в GNAT определяется как 2 ** mod Standard'Address_Size
[1], что будет 2^32
на 32-битной машине. Мне не совсем ясно, относится ли это к битам, байтам, килобайтам или еще к какому-то неясному множителю.
Предположим, что это означает байты, не означает ли это, что самый большой файл, который я могу обработать, будет иметь размер 32 гигабайта ((2^32*8)/1024^3
)? Если да, то есть ли способ сделать это больше?
Поскольку было предложено, чтобы я не проверял (язык) справочное руководство, вот исследование, которое в первую очередь привело меня к вопросу:
В [2] процедура read
определяется как:
procedure Read (File : in File_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset;
From : in Positive_Count);
Чуть выше:
type Count is range 0 .. *implementation-defined*;
subtype Positive_Count is Count range 1 .. Count'Last;
Как видно, фактический диапазон Count
определяется реализацией. Поскольку я использую компилятор GNAT (см. выше), я проверил [1]. Это говорит о том, что
Стандартные пакеты ввода-вывода, описанные в Приложении A для [...] Ada.Stream_IO [...], реализованы с использованием средства потоков библиотеки C; где [...] Все операции ввода/вывода используют fread/fwrite.
В той же документации ниже
function fread
(buffer : voids;
size : size_t;
count : size_t;
stream : FILEs)
куда
type size_t is mod 2 ** Standard'Address_Size;
Опять же, Standard'Address_Size
будет 32
на 32-битной машине (я также проверил, прежде чем спрашивать, так ли это на моем компьютере). Я также до сих пор не уверен после прочтения как справочного руководства по языку, так и документации по реализации GNAT, относится ли Stream_Element_Offset
к байтам или чему-то другому.
Но опять же, если предположить, что это означает байты, не означает ли это, что самый большой файл, который я могу обработать, будет иметь размер 32 гигабайта ((2^32*8)/1024^3
)? Если да, то есть ли способ сделать это больше?
[1]: Реализация стандартного ввода-вывода — Справочное руководство по GNAT
[2]: Справочное руководство по Ada - A.12.1 Пакет Streams.Stream_IO
Ada.Streams.Stream_IO
в справочнике по языку (раздел A.12.1). - person Jacob Sparre Andersen   schedule 22.05.2015Stream_Element_Offset
подписано. - person Simon Wright   schedule 24.05.2015Stream_Element_Offset
относится к битам, а не к байтам? Я читал, чтоStream_Element_Array
может использовать байты. Но я очень, очень запутался в этой части. Ваши комментарии действительно кажутся правдоподобными. Спасибо! - person alex   schedule 24.05.2015