Java создает байтовый массив, размер которого представлен длинным

Я пытаюсь создать байтовый массив, размер которого имеет типlong, Например, думайте об этом как:

long x = _________;
byte[] b = new byte[x]; 

Видимо, вы можете указать толькоint для размера байтового массива.

Прежде чем кто-либо спросит, зачем мне нужен такой большой байтовый массив, я скажу, что мне нужно инкапсулировать данные форматов сообщений, которые я не пишу, и один из этих типов сообщений имеет длину без знака int (long на Яве).

Есть ли способ создать этот байтовый массив?

Я думаю, что если нет никакого способа обойти это, я могу создать выходной поток байтового массива и продолжать подавать его байты, но я не знаю, есть ли какие-либо ограничения на размер байтового массива ...

 Jherico02 июл. 2009 г., 02:01
unsigned int на большинстве 32-битных архитектур имеет только один бит больше, чем int в java. Длина Java составляет 64 бита и не подходит для индекса массива.
 jbu02 июл. 2009 г., 02:45
Я понимаю это, но я не знаю способа полностью представить объем данных, который указывается в сообщении, без реализации моего собственного типа данных.

Ответы на вопрос(5)

но создание массивов с большими размерами (через longs) - это предложенное изменение языка для Java 7. Ознакомьтесь с предложениями Project Coin для получения дополнительной информации

а затем получить к нему доступ (если вам нужен доступ к нему, как к массиву) с помощью RandomAccessFile. API для этого файла использует long как индекс в файле вместо int. Это будет медленнее, но гораздо менее тяжело для памяти.

Это когда вы не можете извлечь то, что вам нужно во время начального сканирования ввода.

(Возможно, для ОП уже немного поздно, но для других это может быть полезно)

К сожалению, Java не поддерживает массивы с более чем 2 31 -1 элементов. Максимальное потребление составляет 2 ГБ места дляbyte[] массив или 16 ГиБ места дляlong[] массив.

Хотя это, вероятно, не применимо в этом случае, если массив будет Разреженных, вы можете избежать использования ассоциативной структуры данных, такой какMap, чтобы сопоставить каждое использованное смещение с соответствующим значением. К тому же, Trove обеспечивает более эффективную реализацию памяти для хранения примитивных значений, чем стандартные коллекции Java.

Если массив не разреженный и вам действительно нужен весь блоб в памяти, вам, вероятно, придется использовать двумерную структуру, например, сMap сопоставление смещений по модулю 1024 в соответствующий 1024-байтовый массив. Такой подход может быть более эффективным для памяти даже для разреженных массивов, поскольку смежные заполненные ячейки могут совместно использовать один и тот жеMap запись.

вам следует использовать поток для чтения ваших данных, а другой - для их записи. Если вам нужен доступ к данным позже в файле, сохраните их. Если вам нужен доступ к чему-то, с чем вы еще не сталкивались, вам нужна двухпроходная система, в которой вы проходите один раз и сохраняете «материал, который вам понадобится для второго прохода, а затем снова проходите».

Компиляторы работают таким образом.

Единственный случай загрузки всего массива за один раз - это случайный случайный случайный доступ ко многим местам в массиве. Если это так, я предлагаю вам загрузить его в несколько байтовых массивов, все они хранятся в одном классе контейнера.

Контейнерный класс будет иметь массив байтовых массивов, но снаружи доступ будет казаться непрерывным. Вы бы просто запросили байт 49874329128714391837, и ваш класс разделил бы ваш Long на размер каждого байтового массива, чтобы вычислить, какой массив получить к нему доступ, а затем использовать остаток для определения байта.

У него также могут быть методы для хранения и извлечения «чанков», которые могут охватывать границы байтового массива, что потребует создания временной копии - но стоимость создания нескольких временных массивов будет более чем компенсирована тем фактом, что вы у меня нет выделенного заблокированного 2-гигабайтного пространства, которое, я думаю, могло бы просто снизить производительнос

Редактировать: пс. Если вам действительно нужен произвольный доступ и вы не можете использовать потоки, тогда реализация содержащего класса - очень хорошая идея. Это позволит вам на лету изменить реализацию с одного байтового массива на группу байтовых массивов и на файловую систему без каких-либо изменений в остальной части вашего кода.

 Mehrdad Afshari02 июл. 2009 г., 02:18
Я сомневаюсь, что даже в этом случае вы могли бы выделить такое количество памяти. Позволятьlongолько @, вторая строка выдает исключение на 64-битной JRE на моем компьютере: "byte [] a1 = новый байт [Integer.MAX_VALUE / 4]; byte [] a2 = новый байт [Integer.MAX_VALUE / 4];" " Ему придется использовать какой-то буфер в памяти, если он имеет дело с таким большим объемом данных.
 Bill K02 июл. 2009 г., 18:27
Вот почему я предложил небольшой класс, который можно использовать для изменения реализации на лету. Конечно, потоковую передачу следует использовать, если это вообще возможно (и это абсолютно возможно!), Но если нет, возможно, можно использовать какой-то алгоритм кэширования с меньшими блоками, содержащими мягкие ссылки.

byte[] с размером максимального 32-разрядного целого числа со знаком потребует 2 ГБ непрерывного адресного пространства. Вы не должны пытаться создать такой массив. В противном случае, если размер не так уж велик (и это просто больший тип), вы можете смело приводить его к int и использовать его для создания массива.

 jbu02 июл. 2009 г., 02:08
mehrdad: я не знаю, если иду по неправильному пути ... опять же, тип сообщения, который я обрабатываю, может быть настолько большим (теоретически). Кажется, что неправильный путь - это парень, который создает этот тип сообщения. Я не знаю, использует ли он полный размер своего сообщения, но я чувствую, что хотел бы поддержать его сообщение и не выбрасывать байты (даже если он их использует).
 Tom Hawtin - tackline02 июл. 2009 г., 01:52
Предполагается, что оригинальный опрашивающий не использует 32-битную JVM. Массив int [] с 2 ^ 32 байтами конструируем ...
 jbu02 июл. 2009 г., 01:53
Фактически максимальное значение равно 31-битному целому числу, поскольку типы java подписаны. Так что примерно 2 концерта.
 Mehrdad Afshari02 июл. 2009 г., 01:56
jbu: Упс. Вы правы. Очевидно, что он также доступен в 64-битном процессе, но я хотел сказать, что он слишком большой, и если вы действительно создаете такой большой массив, скорее всего, вы идете не в ту сторону.
 Mehrdad Afshari02 июл. 2009 г., 02:11
Если вы действительно ожидаете, что сообщение будет настолько большим, вам следует использовать какой-то механизм буферизации, чтобы не загружать все это сразу в память. Я только что попытался создать массив размером 2 ^ 30 байт (Integer.MAX_VALUE / 2) в 64-битной JVM, и он выдает OutOfMemoryError.

Ваш ответ на вопрос