0

ローカル開発モードでは、次のコードを使用して (すべての try/catch 要素を削除して)、war/ ディレクトリ内の ~7.4MB のファイルからオブジェクトに読み取ることができます。

FileInputStream fis;            
fis = new FileInputStream("myObject.dat");              
ObjectInputStream ois;          
ois = new ObjectInputStream(fis);                   
myObject  = (ArrayList<ArrayList<ArrayList<float[]>>>) ois.readObject(); //-- ! prod mode gets stuck here! but dev mode is fine

ローカル開発モードでは、うまく機能し、数秒でオブジェクトを読み取ります。

AppEngine にデプロイすると、ファイルの読み取り中にタイムアウト エラーが発生します。ファイルを見つけて読み取りを開始しますが、時間内に終了できません。エラースタックの一部を次に示します。

java.lang.ExceptionInInitializerError ...
原因: com.google.apphosting.api.DeadlineExceededException: このリクエスト (...) は 2012/06/21 02:19:57.368 UTC に開始され、2012/06/ にまだ実行されていました21 02:20:56.928 UTC。at java.io.FileInputStream.read(Native Method) ...

「myObject.dat」ファイルを小さくすると、プロダクション モードで動作するため、コード自体は問題ありません。GAE はローカル モードのように大きなファイルを十分に高速に読み取ることができません。GAE サーバーが私の小さなローカル マシンよりも遅いのはなぜですか?

4

2 に答える 2

1

ファイルを読み取り、そのようにオブジェクトをインスタンス化するときに、開発環境で消費されるメモリの量を調べて、構成したフロントエンド インスタンスのクラスと比較しましたか?

開発アプリケーション サーバーは、さまざまなクラスのフロントエンドのメモリ サイズをシミュレートしようとしません。

于 2012-06-22T04:23:04.510 に答える
0

Javaシリアル化(例ObjectInputStream)は、オブジェクトを格納するための標準化された方法ではありません。異なるJVM実装間、または同じJVMの異なるバージョン間でさえも機能することが保証されていません。

オブジェクトデータを保存するには、他のより標準化された方法を使用します。たとえば、JSONやXMLなどです。また、プロトコルバッファを使用することもできます。

于 2012-06-21T13:45:56.867 に答える