Question

Comment puis-je ajouter à gros fichiers de manière efficace. J'ai un processus qui doit append sans cesse dans un fichier et que la taille du fichier augmente les performances semble ralentir aussi bien. Y at-il de toute façon de spécifier une grande taille de la mémoire tampon avec le append

Était-ce utile?

La solution

Alors que l'approche de Don est valide, en général (il lancer une exception, cependant, en raison d'une erreur de syntaxe, et vous devez flush() un BufferedOutputStream), je suis la planification d'élaborer davantage (qui prend son temps).

ne fournit pas des objets spéciaux pour les E / S opérations. Ainsi, vous pouvez utiliser Java de FileOutputStream (pour octets d'écriture) ou FileWriter (pour les chaînes d'écriture ). Les deux fournissent un constructeur qui prend un paramètre boolean de append.
Pour les deux, il existe décorateurs ( BufferedOutputStream et BufferedWriter ) , qui sont en mémoire tampon. « Buffering », dans ce cadre, des moyens, que le contenu sont écrits pas nécessairement instantanément au courant sous-jacent, et donc, il y a un potentiel d'optimisation des E / S.

Don déjà fourni un échantillon pour la BufferedOutputStream, et voici un pour le BufferedWriter:

File file = new File("foo")
if (file.exists()) {
    assert file.delete()
    assert file.createNewFile()
}

boolean append = true
FileWriter fileWriter = new FileWriter(file, append)
BufferedWriter buffWriter = new BufferedWriter(fileWriter)

100.times { buffWriter.write "foo" }

buffWriter.flush()
buffWriter.close()

Alors que Groovy ne fournit pas ses propres objets d'E / S, le Groovy JDK (GDK) améliore plusieurs types Java en ajoutant des méthodes pratiques. Dans le cadre d'E / S en sortie, le OutputStream et la File types sont pertinents.

Alors, enfin, vous pouvez travailler avec ceux de la « façon routinière »:

new File("foo").newOutputStream().withWriter("UTF-8") { writer ->
    100.times { writer.write "foo" + it }
}

EDIT: Selon votre enquête plus approfondie:

Aucune des méthodes de GDK permet de régler une taille de mémoire tampon.

Le code ci-dessus "Groovy" sera Ecraser si le fichier appelé à plusieurs reprises. - En revanche, le morceau de code suivant ajoutera la chaîne à une existant fichier et, par conséquent, peut être appelé à plusieurs reprises:

new File("foo").withWriterAppend("UTF-8") { it.write("bar") }

Autres conseils

def file = new File('/path/to/file')

// Create an output stream that writes to the file in 'append' mode
def fileOutput = new FileOutputStream(file, true)

// Buffer the output - set bufferSize to whatever size buffer you want to use
def bufferSize = 512
def fileOutput = new BufferedOutputStream(fileOutput, bufferSize)

try {
    byte[] contentToAppend = // Get the content to write to the file
    fileOutput.write(contentToAppend)
} finally {
    fileOutput.close()
}

Dans la machine virtuelle Java sous Windows le drapeau append a été mis en œuvre inefficently avec une opération de recherche.

Ceci est neighter atomique ni très performant lors de l'ouverture du fichier à plusieurs reprises. Il est censé être fixé quelque part dans la machine virtuelle Java 7: http: // bugs. sun.com/bugdatabase/view_bug.do?bug_id=6631352

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top