Le moyen le plus rapide d'écrire un tableau d'entiers dans un fichier en Java?
Comme le dit le titre, je suis à la recherche de la méthode la plus rapide pour écrire entier tableaux de fichiers. Les tableaux varient en taille, et de façon réaliste contiennent n'importe où entre 2 500 et 25 000 000 ints.
Voici le code, je suis actuellement en utilisant:
DataOutputStream writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
for (int d : data)
writer.writeInt(d);
Étant donné que DataOutputStream a une méthode d'écriture de tableaux d'octets, j'ai essayé de convertir le tableau int à un tableau d'octets comme ceci:
private static byte[] integersToBytes(int[] values) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
for (int i = 0; i < values.length; ++i) {
dos.writeInt(values[i]);
}
return baos.toByteArray();
}
et comme ceci:
private static byte[] integersToBytes2(int[] src) {
int srcLength = src.length;
byte[] dst = new byte[srcLength << 2];
for (int i = 0; i < srcLength; i++) {
int x = src[i];
int j = i << 2;
dst[j++] = (byte) ((x >>> 0) & 0xff);
dst[j++] = (byte) ((x >>> 8) & 0xff);
dst[j++] = (byte) ((x >>> 16) & 0xff);
dst[j++] = (byte) ((x >>> 24) & 0xff);
}
return dst;
}
Les deux semblent donner un mineur augmentation de la vitesse, d'environ 5%. Je n'ai pas testé rigoureusement assez pour confirmer qu'.
Sont là toutes les techniques qui accélèrent ce fichier opération d'écriture, des guides des meilleures pratiques pour Java IO performances d'écriture?
source d'informationauteur Ollie Glass
Vous devez vous connecter pour publier un commentaire.
J'ai eu un coup d'oeil à trois options:
DataOutputStream
;ObjectOutputStream
(pourSerializable
objets, quiint[]
est); etFileChannel
.Les résultats sont
Donc le NIO version est la plus rapide. Il a également l'avantage de permettre des modifications, ce qui signifie que vous pouvez facilement changer un int alors que la
ObjectOutputStream
nécessiterait la lecture de l'ensemble de la matrice, de la modifier et l'écrire dans un fichier.Code suit:
Je voudrais utiliser
FileChannel
de la nio paquet etByteBuffer
. Cette approche semble (sur mon ordinateur) donner 2 à 4 fois de meilleures performances en écriture:De sortie du programme:
C'est le programme:
Je pense que vous devriez envisager l'utilisation de fichier de chaînes (la java.nio bibliothèque) au lieu de la plaine de flux (java.io). Un bon point de départ est cette discussion intéressante: Java NIO FileChannel contre FileOutputstream performance /utilité
et les commentaires ci-dessous.
Cheers!
La principale amélioration, vous pouvez avoir écrit int [];
augmenter la taille de la mémoire tampon. La taille est exacte pour la plupart des flux, mais l'accès au fichier peut être plus rapide avec une grande mémoire tampon. Cela pourrait rendement de 10 à 20% d'amélioration.
Utilisation NIO et un tampon. Cela permet d'écrire des valeurs de 32 bits sans avoir à les convertir octets. Cela peut aboutir à une amélioration de 5%.
BTW: Vous devez être capable d'écrire au moins 10 millions d'int les valeurs par seconde. Avec la mise en cache disque vous augmenter ce chiffre à 200 millions de dollars par seconde.
Tableau est Sérialisable - ne pouvez-vous pas simplement utiliser
writer.writeObject(data);
? Qui va certainement être plus rapide que l'individuwriteInt
appels.Si vous avez d'autres exigences sur le format des données de sortie de récupération en
int[]
c'est une autre question.