0

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

4

2 回答 2

1

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

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

于 2012-06-22T04:23:04.510 回答
0

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

使用其他一些更标准化的方式来存储对象数据:例如 JSON 和 XML。您可能还觉得协议缓冲区很有用。

于 2012-06-21T13:45:56.867 回答