2011-09-27 19 views
7

Merhaba Birkaç büyük CSV Dosyası oluşturmam gerekiyor, girişlerin sayısı 2 milyon olabilir. Ben de bunu nasıl verimli bir şekilde yapmayı merak ettim .. ve bu yüzden aklımdan çıkacak birkaç soru aklımdaBüyük bir CSV dosyası oluşturmak için java IO için En İyi Yöntemler

1. Dosyayı bir BufferedWriter ile Yazarken Ne Sıklıkta Temizlemeliyiz? Ancak bence BufferedWriter kendi arabellek korur ve bu durumda tampon doluysa otomatik olarak temizler o zaman neden tüm o da flush yöntemi var?

  1. Oluşturulacak dosya büyük olacaktır. Dosyayı yazmaya başladığımda dosya otomatik olarak diske bağlanacak mı? (writer.close() işlevini çağırmadan önce) veya tüm dosya yazarı kapatana kadar ana bellekte kalır? o GC hazır yani ben zaten yazılı kısmı hiçbir bölümünün ana bellekte olduğu anlamına uygulanıyor tarafından

+0

Veriler nereden geliyor? Ağ üzerinden veya bellekten başka bir disk tabanlı depolama? DB'den – claymore1977

+0

veri geliyor ve birkaç iş doğrulaması ve işlenmesiyle bu dosyaların oluşturulması gerekiyor – dpsdce

cevap

4
  1. BufferedWriter Uygulaması, uygun olduğunda yıkama konusunda oldukça iyi bir iş çıkarmalıdır. Sizin durumunuzda, asla flush'u aramanız gerekmemelidir. bazen çıkış yazılı derhal yerine BufferedWriter arabölgesine bekleyen tam olmak istiyorum çünkü

    bir flush yöntem var neden gelince, bu. BufferedWriter sadece dosyalar için değil; Konsol veya bir sokete yazmak için de kullanılabilir. Örneğin, bir ağ üzerinden bazı veriler göndermek isteyebilirsiniz, ancak BufferedWriter'un otomatik olarak temizlenmesi için yeterli veri yoktur. Bu verileri hemen göndermek için flush'u kullanırsınız.

  2. BufferedWriter'a yazdığınız tüm veriler aynı anda bellekte kalmayacaktır. BufferedWriter'un tamponu dolduğunda parçalara ayrılır (kızardı). Sonunda close numaralı telefonu aradığınızda, BufferedWriter, arabelleği daha önce diske yazılmadığı ve dosyayı kapattığı kalan her şey için bir daha son temizleme yapar.

0

Benim eğim sonra diske flush, segmentlerde çalışmak olacaktır her 1k veya 2k satır. Bu kadar veri ile bir bellek sınırını zorluyor gibi görünüyor. Bu işlem zaten yavaş olduğundan, güvenli tarafta başarısız olun ve sık sık diske yazın. neyse benim 0,02 $ var :) Bir BufferedWriter da yazar sarın Eğer

3

, disk olur üzere bayt sayısı bir fiziksel yazma önce bellekte kaydedilmesini belirtmek

. (Eğer belirtmezseniz, bir varsayılan var. Bence 8k, ama lütfen bunu gospel olarak belirtmeyin.)

Bir PrintWriter kullanıyorsanız, her satırda diske yazdığını düşünüyorum.

Diğer yazıcılar, her i/o çağrısı ile diske yazılır. Tamponlama yok. Hangi genellikle sucky performans için yapar. Bu yüzden tüm disk yazarları bir BufferedWriter'e sarılmalıdır.

0

BufferedWriter sabit boyutlu bir tampon kullanır, ve tampon tam alır otomatik temizleme olacaktır. Bu nedenle büyük bir dosya parçaları halinde yazılacaktır.

Yıkama yöntemi, bazen arabellek dolmadan önce diske bir şeyler yazmak isteyebilirsiniz. Tipik bir örnek, bir SocketOutputStream'i sarmalayan bir BufferedWriter'dir. Bunu yaparsanız: tampon tamamen dolana kadar istek gönderilmeyecektir çünkü

writer.write(request); 
reader.read(response); 

senin iplik, süresiz bloke muhtemeldir. Bu nedenle, bunun yerine

writer.write(request); 
writer.flush(); // make sure the request is sent now 
reader.read(response); 
yerine

yapmalısınız.

İlgili konular