Я пытаюсь прочитать определенные блоки данных (около 4096 байт) из (возможно) огромного файла.Максимальный размер/смещение потокового файла с использованием Ada.Streams.Stream_IO.Read
Используя 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;
в качестве одного с a, действительный диапазон Count
- , определенный реализацией. Поскольку я использую компилятор GNAT (см. Выше), я проверил [1]. Это указывает, что
пакеты Standard I/O описаны в Приложении А для [...] 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]: The Implementation of Standard I/O - GNAT Reference Manual
[2]: Ada Reference Manual - A.12.1 The Package Streams.Stream_IO
Не похоже, что вы изучили спецификацию пакета 'Ada.Streams.Stream_IO' в справочном руководстве по языку (раздел A.12.1). –
@JacobSparreAndersen Ну, похоже, на самом деле это не так. См. Редактирование в моем вопросе. Кроме того, снисходительность никогда не помогает. Если есть что-то, что я пропустил (что, скорее всего, и почему я спрашиваю), пожалуйста, не стесняйтесь дать проницательный ответ. – alex
32 гигабит, а не гигабайты. –