Google AppEngine无法在生产模式下读取文件

时间:2012-06-21 02:33:38

标签: google-app-engine

在本地开发模式下,我可以使用以下代码从我的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服务器如何比我的小型本地机器慢?

2 个答案:

答案 0 :(得分:1)

当您读取文件并以这种方式实例化对象时,您是否了解了开发环境中消耗了多少内存,并将其与您配置的前端实例类进行比较?

开发应用程序服务器不会尝试模拟各类前端的内存大小。

答案 1 :(得分:0)

Java序列化(例如ObjectInputStream)不是存储对象的标准方法:不保证它可以跨不同的JVM实现工作,甚至可以在同一JVM的不同版本之间工作。

使用其他更标准化的方式来存储对象数据:例如JSON和XML。你可能也会protocol buffers有用。