2013-05-04 8 views
6

Ho provato a scrivere in formato Json in Java, ma ho rilevato NullPointerException quando la dimensione del file è> 1 GB. Qualcuno può aiutarmi a risolvere questo problema?Gson.toJson genera NullPointerException quando la dimensione del file> 1 GB

Il codice continua a generare file Json e la dimensione dei file continua ad aumentare. Una volta la dimensione del file> 1 GB, il codice genera un'eccezione come mostrato di seguito. Ho usato set di dati diversi per i test, quindi non penso che sia il problema dei dati. La mia ipotesi è che ci sia un limite di dimensioni per Gson.toJson in Java.

Il mio codice è:

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

L'eccezione viene generata è:

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

Strano, lo StackTrace indica il 'char []' passato da [ 'StringBuffer.toString'] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/StringBuffer.java#StringBuffer.toString%28% 29) è 'null' ... –

+0

Sì, mi sentivo anche un po 'strano. Ho provato diversi set di dati diversi, e la stessa eccezione si presenta proprio al punto 1GB: – Long

+0

@jlordo Sembra impossibile, dato che la creazione dell'array richiede un argomento 'int'. 'int's può overflow, ma questo genererebbe un' NegativeArraySizeException'. –

risposta

3

Pubblicato come una risposta per aggirare problemi di formattazione nei commenti.

Un array di 2^30 caratteri sarebbe 2^31 byte. Come una singola corda, questo è enorme! L'ovvia domanda che deve essere chiesto è il motivo per cui si ha il codice:

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

Questo può essere facilmente scritta come:

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

Ciò avrebbe significative ripercussioni di memoria, e sarebbe molto più veloce.

Questo non risponde alla domanda perché si ottiene la NPE in una grande StringWriter, ma, francamente, quello che stai facendo è assurdo ....

+0

Grazie! Questo risolve il problema! Ma appare un nuovo problema: ho usato BufferedReader per leggere il file, e ancora una volta getta java.lang.NullPointerException: a java.lang.StringBuffer.ensureCapacityImpl (StringBuffer.java:335) \t a java.lang.StringBuffer.append (StringBuffer.java:111) \t a java.io.BufferedReader.readLine (BufferedReader.java:309) \t a java.io.BufferedReader.readLine (BufferedReader.java:373) – Long

+0

BufferedReader in = new BufferedReader (nuovo FileReader (nomefileinput)); \t \t \t String linea = "" \t \t \t while ((linea = in.readLine())! = Null) ... – Long

+1

@ Long - La mia ipotesi è che tu abbia un'assurdità simile al tuo problema originale; per esempio. si sta tentando di caricare il file in una stringa e analizzare la stringa anziché analizzare direttamente dal flusso di input. In pratica le stringhe e i buffer di stringa Java non possono contenere più di MAX_INT caratteri. Il buffering dei contenuti del tuo file in un'enorme stringa non è in scala ... ed è semplicemente non ragionevole. –

Problemi correlati