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

Google app engine Google AppEngine无法在生产模式下读取文件,google-app-engine,Google App Engine,在本地开发模式下,我可以使用以下代码(删除所有try/catch内容)将war/目录中的~7.4MB文件读入对象 FileInputStream-fis; fis=新文件输入流(“myObject.dat”); 目的输入流ois; ois=新的ObjectInputStream(fis); myObject=(ArrayList)ois.readObject();/--!prod模式在这里卡住了!但是开发模式很好 在本地开发模式下,它工作得很好,可以在几秒钟内读取对象 部署到AppEngine

在本地开发模式下,我可以使用以下代码(删除所有try/catch内容)将war/目录中的~7.4MB文件读入对象

FileInputStream-fis;
fis=新文件输入流(“myObject.dat”);
目的输入流ois;
ois=新的ObjectInputStream(fis);
myObject=(ArrayList)ois.readObject();/--!prod模式在这里卡住了!但是开发模式很好
在本地开发模式下,它工作得很好,可以在几秒钟内读取对象

部署到AppEngine时,读取文件时会出现超时错误。它找到文件并开始读取,但无法及时完成。下面是一些错误堆栈:

java.lang.ExceptionInInitializeError …
原因:com.google.apphosting.api.deadlineExceedexception:此 请求(…)于2012/06/21 02:19:57.368 UTC开始,并且仍然有效 于2012/06/21 02:20:56.928 UTC执行。在 java.io.FileInputStream.read(本机方法)

当我将“myObject.dat”文件变小时,它在生产模式下工作,因此代码本身很好,只是GAE不能像我的本地模式那样足够快地读取较大的文件!GAE服务器怎么可能比我的小型本地机器慢?

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


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

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


development appserver不会尝试模拟各种前端的内存大小。

谢谢Peter。即使标准化最终成为一个问题(这可以通过在同一JVM上执行ObjectOutputStream来解决),现在我有一个更基本的问题:GAE中读取文件的速度太慢(因此会出现超时错误),但在本地模式下要快得多(几秒钟)。为什么GAE这么慢?请看上面的nicks pop测验。您在生产环境中运行的服务器速度较慢,而且是共享的。另外,您正在阅读的文件系统是一个虚拟文件系统,它是在其他基础设施上分层的,速度较慢,如果在google land中发生了其他事情,速度可能会非常慢。最后,当我用自己专有的文本文件序列化替换Java序列化时,我能够在google land中非常快速地将文件读入对象,和我本地的机器一样快。因此,正如Peter第一次怀疑的那样:Java序列化是一个问题。突击测验:谷歌以a)拥有数据中心,其中只有极少数、功能极其强大且价格昂贵的计算机,这些计算机可以完成大量的工作,并且比您的开发机器快得多;b)拥有数据中心,其中包含许多商品机器,依靠分配负载和冗余来完成他们的工作这对Nick有什么帮助?Nick,你可以在下面接受的答案中看到我的评论。我不认为这与谷歌数据中心机器是商品级机器有任何关系。我很确定我的零售价400美元的简易家用机器没有谷歌商品机器那么强大,这一点在我使用Peter的建议时得到了证明。Java序列化确实很慢,但我要说的是,您的期望是,单靠在App Engine上运行,各个进程应该更快。是的,一台单独的机器可能比你的桌面更快——但与你的桌面不同,它同时提供很多应用程序和很多请求。AppEngine的强大之处在于它能够横向扩展到多台机器。谢谢Dave。“将其与前端实例类进行比较”是什么意思?您可以控制部署的应用程序可用的RAM数量。我建议查看您的开发时RAM需求,看看它们是否与您正在使用的前端类相匹配。
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