2013-05-04 25 views
6

Tôi đã cố gắng viết thành định dạng Json trong Java, nhưng gặp NullPointerException khi kích thước tệp là> 1GB. Bất cứ ai có thể giúp tôi để khắc phục vấn đề này?Gson.toJson ném NullPointerException khi kích thước tệp> 1GB

Mã sẽ tiếp tục tạo tệp Json và kích thước tệp tiếp tục tăng. Khi kích thước tệp> 1GB, mã sẽ ném ngoại lệ như được hiển thị bên dưới. Tôi đã sử dụng tập dữ liệu khác nhau để thử nghiệm, vì vậy tôi không nghĩ đó là vấn đề về dữ liệu. Tôi đoán là có một giới hạn kích thước cho Gson.toJson trong Java.

Mã của tôi là:

private HashMap<String,HashSet<Token>> tokenCounter = new HashMap<String,HashSet<Token>>(); 

.... 

private void writeToFile(){ 
    try { 
    PrintWriter out = new PrintWriter(outputFileName); 
    out.println(gson.toJson(tokenCounter)); 
    out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Trường hợp ngoại lệ nó ném là:

java.lang.NullPointerException 
    at java.lang.String.<init>(String.java:301) 
    at java.lang.StringBuffer.toString(StringBuffer.java:790) 
    at java.io.StringWriter.toString(StringWriter.java:204) 
    at com.google.gson.Gson.toJson(Gson.java:481) 
    at com.google.gson.Gson.toJson(Gson.java:460) 
    at com.ebay.classification.discovery.DailyDiscovery.writeToFile(DailyDiscovery.java:181) 
    at com.ebay.classification.discovery.DailyDiscovery.run(DailyDiscovery.java:169) 
    at com.ebay.classification.discovery.TestDailyDiscoveryContinue.run(TestDailyDiscoveryContinue.java:142) 
    at com.ebay.classification.discovery.TestDailyDiscoveryContinue.main(TestDailyDiscoveryContinue.java:245) 
+0

Strange, stacktrace chỉ ra 'cái char [] 'truyền từ ['StringBuffer.toString'] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/StringBuffer.java#StringBuffer.toString%28% 29) là 'null' ... –

+0

Vâng, tôi cũng cảm thấy rất lạ. Tôi đã thử nhiều tập dữ liệu khác nhau, và cùng một ngoại lệ xuất hiện ngay tại điểm 1GB: – Long

+0

@jlordo Điều đó dường như là không thể, vì việc tạo mảng có một đối số 'int'. 'int' có thể tràn, nhưng điều đó sẽ ném một 'NegativeArraySizeException'. –

Trả lời

3

văn như một câu trả lời để có được xung quanh định dạng các vấn đề trong ý kiến.

Một mảng 2^30 char sẽ là 2^31 byte. Là một chuỗi duy nhất, điều này là rất lớn! Câu hỏi đặt ra cần được hỏi là tại sao bạn có mã:

PrintWriter out = new PrintWriter(outputFileName); 
out.println(gson.toJson(tokenCounter)); 
out.close(); 

này có thể dễ dàng được viết như sau:

FileWriter out = new FileWriter(outputFileName); 
gson.toJson(tokenCounter, out); 
out.flush(); 
out.close(); 

này sẽ không có tác động bộ nhớ đáng kể, và sẽ nhanh hơn nhiều.

này không trả lời câu hỏi tại sao bạn nhận được NPE trong một StringWriter lớn, nhưng, thẳng thắn, những gì bạn đang làm là vô lý ....

+0

Cảm ơn! Điều này giải quyết vấn đề! Nhưng một vấn đề mới xuất hiện: Tôi đã sử dụng BufferedReader để đọc tệp, và một lần nữa, nó ném java.lang.NullPointerException: tại java.lang.StringBuffer.ensureCapacityImpl (StringBuffer.java:335) \t tại java.lang.StringBuffer.append (StringBuffer.java:111) \t tại java.io.BufferedReader.readLine (BufferedReader.java:309) \t tại java.io.BufferedReader.readLine (BufferedReader.java:373) – Long

+0

BufferedReader in = new BufferedReader (Trình quản lý tệp mới (inputFileName)); \t \t \t Chuỗi dòng = "" \t \t \t khi ((line = in.readLine())! = Null) ... – Long

+1

@Long - Tôi đoán là bạn có sự vô lý tương tự với vấn đề ban đầu của bạn; ví dụ. bạn đang cố tải tệp vào một Chuỗi và phân tích cú pháp chuỗi thay vì phân tích cú pháp trực tiếp từ luồng đầu vào. Về cơ bản, các chuỗi Java và các bộ đệm chuỗi không thể chứa nhiều hơn MAX_INT ký tự. Buffering nội dung tập tin của bạn trong một chuỗi lớn không quy mô ... và chỉ là không hợp lý. –

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