2010-01-07 14 views
6

Selamlar, Veritabanından çok sayıda kayıt alıyorum ve bir dosyaya yazdım. Büyük dosyaları yazmanın en iyi yolunun ne olduğunu merak ediyordum. (1 Gb - 10 Gb). Gerçekten bunun için Java kullanarak ısrar ederse Şu anda BufferedWriterjava: büyük dosyalar mı yazıyor?

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV)); 
while(done){ 
//do writings 
} 
mbrWriter.close(); 
+1

Bana göre mantıklı görünüyor (rastgele bir karakter kümesinin seçilmesi ve sonuncu blokta temel akışın kapatılması dışında). Muhtemelen performans sorunu diskin veriyi ne kadar hızlı yazabileceğine bağlı olacaktır (ve muhtemelen tekrar okunmak isteyecektir). –

+1

(Veya bu veritabanındaki eşzamanlılık. Bağlantı için yalıtım düzeyini ayarlayın. Belki getirme boyutunu ayarlayın.) –

cevap

9

kullanıyorum

ardından en iyi yönlü veri geldiği gibi hemen kısa sürede yazma olacağını ve böylece tüm toplamak değil, ResultSet numaralı veriyi önce Java'nın belleğine dönüştürür. En azından Java'daki boş hafızaya ihtiyacınız olacaktır. Böylece, örn.

while (resultSet.next()) { 
    writer.write(resultSet.getString("columnname")); 
    // ... 
} 

dedi ki, bunlar şüphesiz daha etkilisi Hiç Java yapabileceği daha vardır yerleşik ihracata to-CSV yetenekleri ile en iyi DB'nin gemiler. Hangisini kullandığınızdan bahsetmediniz, ancak örneğin MySQL ise, bunun için LOAD DATA INFILE'u kullanmış olabilirsiniz. Sadece DB'ye özel belgeleri bakın. Umarım bu yeni bilgiler verir.

4

BufferedWriter için varsayılan arabellek boyutu 8192'dir. Squigabyte dosyaları yazacaksanız, bunu 2 argüman yapıcıyı kullanarak artırmak isteyebilirsiniz; Örneğin. Dosyayı yazmak için gereken syscall sayısını azaltır.

Ama bunun bir kaç yüzde farktan daha fazlasını yapacağından kuşkuluyum. Sonuç kümesinden satırları çekmek muhtemelen ana performans darboğazı olacaktır. Performansta önemli gelişmeler için veritabanının doğal dökme ihracat olanaklarını kullanmanız gerekir.

0

100% emin değilim, ancak BufferedReader verileri RAM'daki bir Arabellek'e yükler. Java 128mb Ram (aksi belirtilmedikçe) kullanabilir, bu nedenle BufferedReader büyük olasılıkla java'nın belleğini bir hataya neden olabilir. Veriyi okumak ve depolamak için InputStreamReader ve FileInputStream kullanmayı deneyin, daha sonra bu dosyayı bir FileOutputStream kullanarak yazın.