J'essaie d'écrire mes données spatiales d'une table dans un fichier. Mais j'ai besoin de connaître la taille exacte des données sur le disque avant d'écrire sur le disque. À titre d'exemple, disons que je suis en train d'écrire sur le disque en utilisant le code suivant:estimation de la taille du fichier sur le disque lors de l'utilisation de ObjectOutputStream
FileOutputStream fos = new FileOutputStream("t.tmp",false);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(gid);
oos.writeUTF(fullname);
oos.writeInt(d.shape.length);
oos.write(d.shape);
oos.close();
fos.close();
Je pensais que la taille du fichier sur le disque est égal à:
size= 4B {for gid, int} + fullname.getBytes.length() {string} + 4B {d.shape.length, int} + d.shape.length
mais en fait, ce qui est très différent de la taille réelle du fichier sur le disque.
J'ai également remarqué que même créer un fichier vide en utilisant ObjectOutputstream conduit à l'espace 4B sur le disque.
Une aide sur la façon de calculer la taille du fichier sur le disque?
(je ne peux pas écrire les données sur le disque, puis lire la taille réelle. Cela permettra de diminuer les performances. Au lieu de cela, je dois calculer la taille des données sur le disque en fonction des valeurs de données stockées dans la mémoire.)
Avez-vous vraiment besoin d'un objet * OutputStream? Utilisez-vous 'writeObject()'? Ou votre code d'exemple est-il aussi sophistiqué que vous l'obtenez? Il semble que vous feriez mieux d'utiliser un [DataOutputStream] (http://docs.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html). (Un objet 'ObjectOutputStream' écrit des informations d'en-tête de flux et garde la trace des références aux objets déjà écrits afin qu'il puisse simplement écrire une référence etc. - tout cela entraverait vos efforts pour pré-calculer la taille. –
Également - pouvez-vous développer le problème de performances que vous percevez en utilisant le système de fichiers après l'écriture des octets? –
en termes de problème de performance. J'ai 40 Go de données dans ma table et beaucoup d'entre elles sont des données spatiales. Je partitionne ma table de manière à ce que la taille totale des données stockées dans chaque fichier soit inférieure à une certaine valeur (max_file_size). Au premier tour, je calcule la taille sur le disque de chaque rangée de ma table et dans les tours suivants, je résume tant d'entre eux qui peuvent tenir dans un fichier avec une taille de fichier totale inférieure à max_file_size. Ainsi, écrire chaque fichier et ensuite mesurer la taille réelle du fichier sur le disque n'est pas une option. – reza