2010-01-07 29 views
6

Chúc mừng, Tôi nhận được số lượng lớn hồ sơ từ cơ sở dữ liệu và ghi vào một tệp. Tôi đã tự hỏi cách tốt nhất để viết các tệp lớn. (1Gb - 10Gb).java: ghi các tệp lớn?

Hiện nay tôi đang sử dụng BufferedWriter

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

Có vẻ hợp lý với tôi (ngoài việc chọn một bộ ký tự ngẫu nhiên và đóng luồng bên dưới trong khối cuối cùng). Có lẽ vấn đề hiệu suất sẽ giảm xuống tốc độ đĩa có thể ghi dữ liệu (và có thể nó sẽ được đọc lại). –

+1

(Hoặc đồng thời trong cơ sở dữ liệu đó. Đặt mức cách ly cho kết nối. Có thể đặt kích thước tìm nạp.) –

Trả lời

9

Nếu bạn thực sự nhấn mạnh sử dụng Java cho điều này, thì cách tốt nhất là nên viết ngay càng sớm càng dữ liệu đi vào và do đó không thu tất cả dữ liệu từ ResultSet vào bộ nhớ của Java trước tiên. Bạn sẽ cần ít nhất là nhiều bộ nhớ trống trong Java nếu không.

Do đó, ví dụ:

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

Điều đó nói rằng, các tàu DB phong nha nhất với khả năng xuất CSV đến được xây dựng chắc chắn hiệu quả hơn bao giờ hết trong Java. Bạn đã không đề cập đến cái nào bạn đang sử dụng, nhưng nếu nó là ví dụ MySQL, bạn có thể đã sử dụng LOAD DATA INFILE cho việc này. Chỉ cần tham khảo tài liệu DB cụ thể. Hy vọng điều này mang lại những hiểu biết mới.

4

Kích thước bộ đệm mặc định cho BufferedWriter là 8192. Nếu bạn định ghi các tệp squigabyte, bạn có thể muốn tăng điều này bằng cách sử dụng hàm tạo đối số 2; ví dụ.

int buffSize = ... // 1 megabyte or so 
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize); 

Điều này sẽ giảm số lượng syscalls cần thiết để ghi tệp.

Nhưng tôi nghi ngờ rằng điều này sẽ tạo ra nhiều hơn một vài phần trăm khác biệt. Việc kéo các hàng từ resultset có thể sẽ là nút cổ chai hiệu suất chính. Để cải thiện đáng kể hiệu suất, bạn cần phải sử dụng cơ sở xuất bản hàng loạt của cơ sở dữ liệu gốc.

0

Im không chắc chắn 100%, nhưng nó xuất hiện tha BufferedReader tải dữ liệu vào bộ đệm trong RAM. Java có thể sử dụng 128MB Ram (trừ khi có quy định khác), vì vậy BufferedReader có khả năng sẽ tràn bộ nhớ của java gây ra lỗi. Hãy thử sử dụng InputStreamReader và FileInputStream để đọc và sau đó lưu trữ dữ liệu trong một char, sau đó chỉ cần viết rằng char bằng cách sử dụng một FileOutputStream.

Các vấn đề liên quan