在本地开发模式下,我可以使用以下代码从我的war /目录中的~7.4MB文件读取到一个对象(删除所有try / catch内容)
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。在 java.io.FileInputStream.read(Native Method)...
当我使“myObject.dat”文件变小时,它在生产模式下工作,所以代码本身很好,只是GAE不能像我的本地模式那样快速读取更大的文件! GAE服务器如何比我的小型本地机器慢?
答案 0 :(得分:1)
当您读取文件并以这种方式实例化对象时,您是否了解了开发环境中消耗了多少内存,并将其与您配置的前端实例类进行比较?
开发应用程序服务器不会尝试模拟各类前端的内存大小。
答案 1 :(得分:0)
Java序列化(例如ObjectInputStream
)不是存储对象的标准方法:不保证它可以跨不同的JVM实现工作,甚至可以在同一JVM的不同版本之间工作。
使用其他更标准化的方式来存储对象数据:例如JSON和XML。你可能也会protocol buffers有用。