2

GSONとJacksonを使用してAndroidで約11MBの大きなJSONを解析する際に問題に直面しています。問題は、メモリ不足エラー例外が発生し、ヒープ サイズがこのプロセスを実行するのに十分でないことです。これは私のペーパーモデルクラスです

public class Paper {

public int primaryKey;

public String title;

public int entry;

public Boolean favourite;

public String comment;

public int opt;

public int score;
}

これは私のレスポンスモデルクラスです

public class Response {

public List<Paper> papers;

} 

これは私のJSON文字列です

{"Paper":[[{"abstract":"Not Available","title":"A Fully Intraocular 0.0169mm<sup>2<\/sup>/pixel 512-Channel Self-Calibrating Epiretinal Prosthesis in 65nm CMOS","primaryKey":3,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A Scalable 2.9mW 1Mb/s eTextiles Body Area Network Transceiver with Remotely Powered Sensors and Bi-Directional Data Communication","primaryKey":14,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 0.18µm CMOS SoC for a 100m-Range 10fps 200×96-Pixel Time-of-Flight Depth Sensor","primaryKey":20,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 12b 1.6GS/s 40mW DAC in 40nm CMOS with >70dB SFDR over Entire Nyquist Bandwidth","primaryKey":26,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"All-Digital Hybrid Temperature Sensor Network for Dense Thermal Monitoring","primaryKey":49,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"32Gb/s Data-Interpolator Receiver with 2-Tap DFE in 28nm CMOS","primaryKey":51,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 93% Efficiency Reconfigurable Switched-Capacitor DC-DC Converter Using On-Chip Ferroelectric Capacitors","primaryKey":60,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 45nm CMOS Near-Field Communication Radio with 0.15A/m RX Sensitivity and 4mA Current Consumption in Card Emulation Mode","primaryKey":61,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1}]]}

どこでミスをしたかわかりません。私は論文のリストに対してnullを取得しています。

4

2 に答える 2

4

ストリーミング パーサーを使用して、完全な入力が読み取られる前に、読み取ったコンテンツを処理してみてください。このようにして、完全な構造をメモリに保持することを避けることができます。

たとえば、入力 JSON が巨大な配列の場合、入力要素を要素ごとに処理できます。

于 2013-01-19T08:56:22.977 に答える
0

Gensonを試してみたり、データバインディングAPI(new Genson().deserialize(json, ToClass.class))を確認したり、ストリーミングAPIを直接使用したりすることもできます。

それはあなたが何をしたいかによります。メモリ内のすべてのデータが必要な場合、選択肢はあまりありません。データを増やす必要があります。読んでいるときに処理でき、常にメモリ内で必要としない場合は、ストリーミングAPIで正常に機能します(非常にパフォーマンスが高く、使用するメモリが非常に少ない)。

ソリューションの編集

  1. データバインディングを使用して、作業を減らす必要があります。まず、このプロジェクトhttps://github.com/joelittlejohn/jsonschema2pojoを見てください。これにより、jsonの例に基づいてJavaBeanクラスを生成できます。new Genson().deserialize(json, MyGeneratedClass.class);複数のser/deserを実行している場合にのみ生成されたクラスを実行する場合は、パフォーマンスを向上させるためにGensonインスタンスを再利用する必要があります。

  2. 1)を使用したくない場合、実行時に構造が変更された場合(これによりクラスの生成が妨げられます)、またはまだメモリの問題がある場合は、GensonsストリーミングAPIを使用してください。メモリ効率が高く、パフォーマンスが高く、使いやすいです。

于 2013-01-19T11:27:31.620 に答える