Java création de tableau d'octets dont la taille est représentée par une longue

j'essaye de créer un tableau byte dont la taille est de type long. Par exemple, il pense que:

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

Apparemment, vous ne pouvez spécifier qu'un int pour la taille d'un tableau d'octets.

avant que quelqu'un ne me demande pourquoi j'aurais besoin d'un tableau d'octets si grand, je dirai que j'ai besoin d'encapsuler des données de formats de messages que je n'écris pas, et un de ces types de messages a une longueur d'int non signé (long en Java).

Est-il possible de créer cet octet tableau?

je pense que s'il n'y a aucun moyen de l'éviter, je peux créer un flux de sortie de tableau octet et continuer à l'alimenter en octets, mais je ne sais pas s'il y a une restriction sur une taille d'un tableau octet...

25
demandé sur Nayuki 2009-07-02 03:47:07

5 réponses

(Il est probablement un peu tard pour l'OP, mais ça peut être utile pour les autres)

malheureusement Java ne supporte pas les tableaux avec plus de 2 31-1 éléments. La consommation maximale est de 2 GiB d'espace pour un byte[] array, ou 16 Go d'espace pour un long[] array.

Tandis qu'il n'est probablement pas applicable dans ce cas, si le tableau va être éparses, vous pourriez être en mesure de vous en sortir en utilisant une structure de données comme un Map pour faire correspondre chaque décalage utilisé à la valeur appropriée. En outre, Trésor fournit une implémentation plus économe en mémoire pour stocker des valeurs primitives que les collections Java standard.

si le tableau n'est pas clairsemé et que vous avez vraiment, vraiment besoin du blob entier en mémoire, vous devrez probablement utiliser une structure en deux dimensions, par exemple avec un Map mise en correspondance des offsets modulo 1024 avec le tableau approprié de 1024 octets. Ce approche pourrait être plus efficace de mémoire, même pour les tableaux épars, puisque les cellules remplies adjacentes peuvent partager la même Map entrée.

20
répondu thkala 2017-09-01 13:57:31

byte[] avec la taille de l'entier signé maximum de 32 bits exigerait 2 Go d'espace d'adresse contigu. Vous ne devriez pas essayer de créer un tel tableau. Sinon, si la taille n'est pas vraiment si grande (et c'est juste un type plus grand), vous pouvez sans risque le lancer à un int et l'utiliser pour créer le tableau.

6
répondu Mehrdad Afshari 2009-07-01 23:57:23

vous devriez probablement utiliser un flux pour lire vos données et un autre pour les écrire. Si vous êtes gong besoin d'accéder aux données plus tard dans le fichier, enregistrez-le. Si vous avez besoin d'accéder à quelque chose que vous n'avez pas encore rencontré, vous avez besoin d'un système de deux passes où vous passez une fois et stocker les "choses dont vous aurez besoin pour la deuxième passe, puis courir à travers à nouveau".

les compilateurs fonctionnent de cette façon.

le seul cas pour charger dans le tableau entier à la fois est si vous devez accès aléatoire répété à de nombreux endroits dans le tableau. Si c'est le cas, je vous suggère de charger en plusieurs tableaux d'octets stockés dans un seul conteneur de classe.

la classe container aurait un tableau de tableaux d'octets, mais de l'extérieur tous les accès sembleraient contigus. Vous voudriez juste demander pour byte 49874329128714391837 et votre classe diviserait votre long par la taille de chaque tableau de byte pour calculer quel tableau pour accéder, puis utiliser le reste pour déterminer octet.

il pourrait également avoir des méthodes pour stocker et récupérer des "morceaux" qui pourraient traverser les limites byte-array qui nécessiteraient la création d'une copie temporaire--mais le coût de création de quelques tableaux temporaires serait plus que compensé par le fait que vous n'avez pas un espace de 2 Go verrouillé alloué qui je pense pourrait juste détruire votre performance.

Edit: ps. Si vous avez vraiment besoin de l'accès aléatoire et que vous ne pouvez pas utiliser les flux, alors implémenter une classe containing est une très bonne chose. Idée. Il vous permettra de changer l'implémentation à la volée d'un simple tableau d'octets à un groupe de tableaux d'octets à un système basé sur un fichier sans aucune modification au reste de votre code.

1
répondu Bill K 2009-07-02 00:13:57

ce n'est pas d'une aide immédiate mais créer des tableaux de plus grande taille (via des longs) est un changement de langage proposé pour Java 7. Consultez les propositions de pièces de monnaie pour plus d'information

1
répondu Brian Agnew 2009-07-02 10:24:57

Une façon de "stocker" la matrice est de l'écrire dans un fichier, puis accédez-y (si vous avez besoin d'accéder à un tableau) à l'aide d'un RandomAccessFile. L'api pour ce fichier utilise long comme un index dans le fichier au lieu de int. Il sera plus lent, mais beaucoup moins dur sur la mémoire.

c'est quand vous ne pouvez pas extraire ce dont vous avez besoin pendant le scan d'entrée initial.

0
répondu Kathy Van Stone 2009-07-02 00:35:09