2013-05-04 14 views
6

Próbowałem zapisać w formacie Json w Javie, ale napotkałem NullPointerException, gdy rozmiar pliku jest> 1 GB. Czy ktoś może mi pomóc rozwiązać ten problem?Gson.toJson zgłasza wyjątek NullPointerException, gdy rozmiar pliku> 1GB

Kod nadal generuje pliki Json, a ich rozmiar stale rośnie. Po wielkości pliku> 1 GB kod generuje wyjątek, jak pokazano poniżej. Użyłem innego zestawu danych do testowania, więc nie sądzę, że jest to kwestia danych. Domyślam się, że istnieje limit rozmiaru dla Gson.toJson w Javie.

Mój kod to:

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(); 
    } 
} 

Wyjątkiem rzuca to:

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

dziwne, StackTrace wskazuje 'char []' przekazywane z ['StringBuffer.toString'] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/StringBuffer.java#StringBuffer.toString%28% 29) to 'null' ... –

+0

Tak, czułem się też trochę dziwny. Wypróbowałem kilka różnych zestawów danych, a ten sam wyjątek pojawia się tuż przy punkcie 1GB: – Long

+0

@jlordo To wydaje się niemożliwe, ponieważ tworzenie tablicy przyjmuje argument "int". 'int's może przepełnić, ale spowodowałoby to' NegativeArrayArraySizeException'. –

Odpowiedz

3

Wysłany jako odpowiedź obejść formatowania problemy w komentarzach.

Tablica o rozmiarze 2^30 będzie miała 2^31 bajtów. Jako pojedynczy ciąg jest ogromny! Oczywiste pytanie, które należy zadać to dlaczego masz kod:

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

ten można łatwo zapisać jako:

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

To nie miałyby istotnego wpływu pamięci i będzie znacznie szybciej.

To nie jest odpowiedź na pytanie, dlaczego masz NPE w dużej StringWriter, ale, szczerze mówiąc, to, co robisz jest absurdem ....

+0

Dzięki! To rozwiązuje problem! Pojawia się jednak nowy problem: użyłem BufferedReader do odczytania pliku i ponownie wywołuje java.lang.NullPointerException: w java.lang.StringBuffer.ensureCapacityImpl (StringBuffer.java:335) \t w java.lang.StringBuffer.append (StringBuffer.java:111) \t w java.io.BufferedReader.readLine (BufferedReader.java:309) \t w java.io.BufferedReader.readLine (BufferedReader.java:373) – Long

+0

BufferedReader w = new BufferedReader (nowy FileReader (inputFileName)); \t \t \t linia String = "" \t \t \t while ((linia = in.readLine())! = Null) ... – Long

+1

@ Long - Domyślam się, że masz podobny absurd do pierwotnego problemu; na przykład próbujesz załadować plik do łańcucha i przeanalizować ciąg znaków zamiast analizowania bezpośrednio ze strumienia wejściowego. Zasadniczo łańcuchy Java i bufory ciągów nie mogą zawierać więcej niż MAX_INT znaków. Buforowanie zawartości pliku w wielkim łańcuchu nie jest skalowalne ... i nie jest po prostu sensowne. –

Powiązane problemy