2013-05-04 24 views
6

JavaでJsonフォーマットに書き込もうとしましたが、ファイルサイズが1GBを超えるとNullPointerExceptionが発生しました。誰でもこの問題を解決するのに役立つことができますか?ファイルサイズが1GBを超えると、Gson.toJsonがNullPointerExceptionをスローする

コードはJsonファイルを生成し続け、ファイルのサイズは増加し続けます。ファイルサイズが1GBを超えると、コードは次のように例外をスローします。テスト用に異なるデータセットを使用していたため、データの問題ではないと思います。私の推測では、JavaのGson.toJsonにはサイズ制限があるということです。

私のコードは次のとおりです。

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

それはスロー例外がある:コメントで書式設定の問題を回避する答えとして投稿

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

....あなたが大にStringWriterでNPEを取得し、なぜ質問に答える、しかし、率直に言って、何をやっていることは不合理ではありません、スタックトレースは、 'charは[]'から渡さ示し['StringBuffer.toString'](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/StringBuffer.java#StringBuffer.toString%28% 29)は "ヌル" ... –

+0

はい、私は奇妙な感じもありました。私はいくつかの異なるデータセットを試してみましたが、同じ例外が1GBポイントで出てきました。 – Long

+0

@jlordo配列の作成に 'int'引数があるので不可能です。 'int'はオーバーフローする可能性がありますが、' NegativeArraySizeException'がスローされます。 –

答えて

3

2^30文字の配列は2^31バイトになります。単一の文字列として、これは巨大です!あなたは、コードを持っている理由尋ねする必要が明白な質問です:

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

これは簡単のように書くことができます。これは、有意なメモリへの影響を持っていないだろう、とずっと速いだろう

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

これは奇妙な

+0

ありがとう!これは問題を解決します!しかし、新しい問題が現れます。私はBufferedReaderを使ってファイルを読み込み、再びjava.lang.NullPointerExceptionをスローします:java.lang.StringBuffer.ensureCapacityImpl(StringBuffer.java:335) \t at java.lang.StringBuffer.append (StringBuffer.java:111)java.io.BufferedReader.readLineで \t(BufferedReader.java:309)java.io.BufferedReader.readLineで \t(BufferedReader.java:373)=新しいBufferedReaderの内 – Long

+0

BufferedReaderの(新規FileReader (inputFileName)); \t \t \t文字列= "" \t \t \t while((line = in.readLine())!= null)... – Long

+1

@Long - 私の推測では、元の問題に似たような愚かさがあることです。例えばファイルをStringにロードして、入力ストリームから直接解析するのではなく、文字列を解析しようとしています。基本的に、Java文字列と文字列バッファにはMAX_INT文字を超える文字を含めることはできません。巨大なStringでファイルコンテンツをバッファリングすると、スケールされません。ちょうど賢明ではありません。 –

関連する問題