我正在编写一个Web应用程序,其中Java后端运行在Tomcat服务器和JavaScript客户端上。
在后端我必须处理一个大的int [] [] []数组,它包含CT扫描的信息。尺寸约为1024x1024x200。
我只想在需要处理像图像切片这样的新数据时将这个数组加载到内存中,并将其存储在某种数据库中剩下的时间。
到目前为止我尝试过的事情:
使用JDBM3存储String,int [] [] [] Hashmap,遇到内存不足错误
使用bytea []数据类型序列化对象并将其保存到PostgreSQL-DB中,正确存储但在重新加载时出现内存错误。
所以我的第一个问题是,如何保存这么大的数组(哪个db,方法)?它应该加载速度快,并且应该有某种多用户访问安全性,因为多个用户将能够使用前端,因此将int [] [] []加载到后端。数据库应具有非商业许可证,例如。 GPL,MIT,Apache ......
第二个问题,我知道我可以将序列化的数组保存在文件系统中,并将链接保留在数据库中,但对多个用户来说是否安全?
答案 0 :(得分:2)
如果客户端计算机上有足够的RAM,则可以从简单地增加JVM堆的大小开始。这样,您应该能够创建更大的数组而不会遇到“内存不足”错误。
单独使用阵列需要至少大约800 Mb(1024 x 1024 x 200 x 32位)。
答案 1 :(得分:1)
我认为MemoryMappedFile
的诞生是为了处理这样的事情。它为您提供磁盘上文件的数组视图,具有随机读取和写入权限。您所要做的就是开发一个方案,在int[][][]
之上设置byte[]
,这应该不是问题。如果你这样做,你永远不必将整个数组保存在内存中,而只创建你实际使用的切片。即使您需要迭代所有切片,也可以一次只实例化一个切片。
答案 2 :(得分:0)
如果是CAT扫描,像素是256色灰度吗?如果是这样,您可以通过将数据存储为字节数组而不是int数组来节省大量内存。如果是64K灰度,请使用short而不是int。