Java creando una matriz de bytes cuyo tamaño está representado por un largo

Estoy tratando de crear una matriz de bytes cuyo tamaño es de tipo long . Por ejemplo, piense en esto como:

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

Aparentemente, solo puede especificar un int para el tamaño de una matriz de bytes.

Antes de que alguien pregunte por qué necesitaría una matriz de bytes tan grande, diré que necesito encapsular datos de formatos de mensaje que no estoy escribiendo, y uno de estos tipos de mensajes tiene una longitud de unsigned int ( long en Java).

¿Hay alguna manera de crear esta matriz de bytes?

Estoy pensando que si no hay forma de evitarlo, puedo crear un flujo de salida de matriz de bytes y seguir alimentándolo bytes, pero no sé si hay alguna restricción en el tamaño de una matriz de bytes …

(Es probable que sea un poco tarde para el PO, pero podría ser útil para otros)

Desafortunadamente, Java no admite matrices con más de 2 31 -1 elementos. El consumo máximo es de 2 GiB de espacio para una matriz de byte[] o 16 GiB de espacio para una matriz long[] .

Si bien es probable que no sea aplicable en este caso, si la matriz va a ser escasa , es posible que pueda salirse con la suya usando una estructura de datos asociativa como un Map para hacer coincidir cada desplazamiento utilizado con el valor apropiado. Además, Trove proporciona una implementación más eficiente de la memoria para almacenar valores primitivos que las colecciones estándar de Java.

Si la matriz no es escasa y realmente, realmente necesita toda la burbuja en la memoria, probablemente tendrá que usar una estructura bidimensional, por ejemplo, con un Map corresponda con el módulo de desviaciones 1024 a la matriz de 1024 bytes adecuada. Este enfoque podría ser más eficiente en la memoria incluso para matrices dispersas, ya que las celdas llenas adyacentes pueden compartir la misma entrada de Map .

Un byte[] con el tamaño del entero máximo con signo de 32 bits requeriría 2 GB de espacio de direcciones contiguas. No deberías tratar de crear dicha matriz. De lo contrario, si el tamaño no es tan grande (y es solo un tipo más grande), puede convertirlo en int y usarlo para crear la matriz.

Probablemente deberías estar usando una transmisión para leer tus datos y otra para escribirla. Si desea acceder a los datos más adelante en el archivo, guárdelo. Si necesita acceder a algo con lo que aún no se ha encontrado, necesita un sistema de dos pasos en el que se ejecute una vez y almacene las “cosas que necesitará para el segundo pase, luego vuelva a ejecutarlo”.

Los comstackdores funcionan de esta manera.

El único caso para cargar en toda la matriz de una vez es si tiene que acceder de forma aleatoria varias ubicaciones en toda la matriz. Si este es el caso, sugiero que lo cargue en matrices de múltiples bytes, todas almacenadas en una única clase de contenedor.

La clase de contenedor tendría una matriz de matrices de bytes, pero desde el exterior todos los accesos parecerían contiguos. Simplemente pediría byte 49874329128714391837 y su clase dividiría su Long por el tamaño de cada matriz de bytes para calcular a qué matriz acceder, luego usaría el rest para determinar el byte.

También podría tener métodos para almacenar y recuperar “fragmentos” que podrían abarcar límites de matriz de bytes que requerirían la creación de una copia temporal, pero el costo de crear algunas matrices temporales estaría más que compensado por el hecho de que no Tengo un espacio bloqueado de 2 gb asignado que creo que podría destruir tu rendimiento.

Editar: ps. Si realmente necesita el acceso aleatorio y no puede usar transmisiones, implementar una clase contenedora es una muy buena idea. Le permitirá cambiar la implementación sobre la marcha de una matriz de un solo byte a un grupo de matrices de bytes a un sistema basado en archivos sin ningún cambio en el rest de su código.

No es de ayuda inmediata, pero la creación de matrices con tamaños más grandes (a través de longs) es un cambio de lenguaje propuesto para Java 7. Consulte las propuestas de Project Coin para obtener más información

Una forma de “almacenar” la matriz es escribirla en un archivo y luego acceder a ella (si necesita acceder a ella como una matriz) usando un RandomAccessFile. La API de ese archivo utiliza desde hace mucho tiempo un índice en el archivo en lugar de int. Será más lento, pero mucho menos duro en la memoria.

Esto es cuando no puede extraer lo que necesita durante el escaneo de entrada inicial.