Tạo tệp CSV bằng Java


8

Chúng tôi có một yêu cầu trong dự án của mình là tạo một tệp CSV lớn cứ sau 2 giờ sử dụng chương trình Java.

Tập tin này sẽ có khoảng 60.000 dòng (khoảng 120 ký tự trên mỗi dòng). Tôi không chắc chắn về kích thước chưa.

Tôi muốn biết liệu tôi có gặp phải bất kỳ vấn đề nào về bộ nhớ không vì tôi sẽ mở tệp bằng FileWriter và sau đó tiếp tục ghi và cuối cùng đóng tệp.

Tôi có nên lo lắng về kích thước của tập tin? Nếu có, có bất kỳ kỹ thuật tốt nào khác để ghi vào một tệp lớn trong Java ngoài việc sử dụng FileWriter không?

Chúng tôi đang sử dụng Java 5.


Phiên bản Java nào bạn đang sử dụng?
Martijn Verburg

Yo ... ý tôi là Nes. Chết tiệt, tôi lấy 8 quả bóng ma thuật của tôi.
Tách ra

Nếu vấn đề tốc độ, hãy thử một bộ đệm thực sự lớn (nhiều megabyte). Nó tăng tốc độ ghi tập tin của tôi theo hệ số 10. Tất nhiên, kết quả của bạn có thể thay đổi ....
RalphChapin

Câu trả lời:


14

Không, bạn không nên. Điểm của một tệp là lưu trữ những thứ bên ngoài bộ nhớ truy cập ngẫu nhiên; Kích thước của FileWriter là không đổi và có thể khá nhỏ, tất cả mọi thứ được xem xét, ngay cả khi đó là FileWriter được đệm. Việc viết lại liên tục có thể gây ra tải I / O hoặc CPU tăng đột biến, nhưng gần như chắc chắn không bị thiếu bộ nhớ.


Tôi nghĩ rằng dữ liệu tập tin sẽ được lưu trong bộ nhớ cho đến khi tôi đóng bộ lọc? có vẻ như giả định của tôi là sai
java_mouse

8
Không, BufferedFileWriter sẽ giữ một lượng dữ liệu nhất định trong bộ nhớ, nhưng số lượng đó là một lượng cố định, tùy thuộc vào môi trường mà nó được gọi. Nó không tăng liên kết với số byte bạn đẩy qua - đó sẽ là một số byte công thức cho thảm họa!
Kilian Foth

8

Như Killian Foth đã viết nó, bạn sẽ không có vấn đề gì cả, 60000 dòng không lớn lắm. Tôi chỉ muốn đề nghị bạn sử dụng bất kỳ trình phân tích cú pháp CSV miễn phí nào được cung cấp ở đây theo sáng kiến ​​"Commons CSV" tại http://commons.apache.org/csv/ thay vì viết triển khai của riêng bạn.

Tôi đã sử dụng Super CSV cho một vài dự án và tôi chắc chắn không có vấn đề gì với nó.


1
Tôi đã sử dụng openCSV. Tôi thích nó. 60K dòng là gì. Máy tính xách tay cũ của tôi xử lý trong một giây.
ahoffer

Thật tuyệt khi nghe Jalayn! Chúng tôi vừa phát hành phiên bản mới của Super CSV với hàng đống sửa lỗi, tính năng mới và một trang web hoàn toàn mới. Ồ, và giờ nó đang ở trung tâm Maven :)
James Bassett

5

Không sử dụng FileWriter. Không phải vì lo ngại về hiệu năng (các lớp IO của Java không giữ mọi thứ trong bộ nhớ, các dòng ut 60k không là gì ngay cả khi chúng đã làm), nhưng vì nó không cho phép bạn chọn mã hóa ký tự. Nó sẽ hoàn toàn sử dụng mã hóa mặc định của nền tảng, có nghĩa là văn bản bên ngoài ASCII có thể bị hỏng.

Thay vào đó, hãy sử dụng một OutputStreamWriter bao bọc FileOutputStream. Hoặc, thậm chí tốt hơn, một thư viện CSV, sẽ xử lý tất cả các vấn đề này.


Hoặc thay vì OutputStreamWriter, hãy sử dụng các lớp NIO (FileChannel với ByteBuffers)? Tất cả các thư viện CSV có xử lý mã hóa không? Tôi đã xem nhanh SuperCSV và không thấy gì về việc xử lý mã hóa.
Sam Goldberg

1
@Sam Goldberg: bạn nói đúng, nó dường như hoạt động trên Reader / Writer và để lại mối quan tâm đó cho người gọi.
Michael Borgwardt

@MichaelBorgwardt bạn nói đúng - Super CSV được viết sử dụng IoC, do đó, nó tùy thuộc vào bạn để cung cấp một đọc / ghi - cách mà bạn có thể viết vào một tập tin, nén tập tin, HTTP phản ứng, vv Chúng tôi vừa phát hành một mới phiên bản - vui lòng kiểm tra xem :) Ồ, và về mã hóa ký tự, tôi luôn thấy bài viết về Joel Spolsky của Unicode là tuyệt vời.
James Bassett

1

Bạn có thể cân nhắc sử dụng BufferedWriter, mặc dù điều đó có thể không giúp ích đáng kể cho hiệu suất, nhưng đó là cách tốt nhất trong mọi trường hợp, vì tôi tưởng tượng số lượng dòng sẽ không luôn là 60.000.

Bạn đã xem xét việc nén các tập tin sau đó? Nếu bạn dự định có nhiều tệp này được đặt xung quanh, có thể bạn nên nén nó lại sau khi được ghi vào, đặc biệt là nếu bạn sẽ tạo các tệp này một vài giờ một lần.

Đối với những gì liên quan đến bộ nhớ, có lẽ bạn không có gì phải lo lắng trừ khi bạn đang làm việc trên một hệ thống có rất ít bộ nhớ, trong trường hợp đó bạn nên sử dụng BufferedWriter và đặt rõ ràng kích thước bộ đệm.


1
BufferedFileWriter là gì?
Michael Borgwardt

Giáo sư. Tôi có nghĩa là BufferedWriter. Đã sửa.
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.