我正在使用Matlab和Java驱动程序。在向DB写入一些大数据后,我想稍后阅读它们。 这些文件大约100MB,因此我将它们写入GridFS。
我用Java驱动程序将数据读入Matlab:
dbgridfs = GridFS(db, 'data_gridfs');
file1 = dbgridfs.findOne('bigdata');
在那段代码之后,我将在Matlab工作区中获得一个对象: 名称大小字节类 file1 1x1 com.mongodb.gridfs.GridFSDBFile
现在我将(Java?) - 对象转换为nativ Matlab变量时出现问题。
我在不同的网站上搜索了很多,但我没有得到它。目前我正在我的硬盘上写数据,之后我把它读成一个原生的Matlab变量 - 但这是一种非常肮脏的方式,不要问我有关性能的问题:(
我是否错过了使用Java驱动程序的现有解决方案和/或您是否知道一些可以帮助我的代码? 谢谢你的帮助。
问候 MATL
答案 0 :(得分:1)
我从来没有回答过任何论坛问题,但我特别从stackoverflow中受益匪浅,所以我想我必须至少回复一次。由于上述问题现在困扰我近两天,我终于找到了一个解决方案,我认为这将是回馈社区的一个好主题。
我遇到了使用Java驱动程序从MongoDB / GridFS检索图像(.png)的相同问题。首先,如上所述,您需要检索文件Java对象:
import com.mongodb.*;
import com.mongodb.gridfs.*;
mongoClient = MongoClient('server_name',27017);
db = mongoClient.getDB('database_name');
imgData = GridFS(db,'image_data');
上面的代码部分是使用图像数据获取集合。然后,可以检索图像数据Java对象:
javaIObj = imgData.findOne('image_name.png');
现在需要ByteArrayOutputStream,可以将数据流传送到而不是文件:
import java.io.ByteArrayOutputStream;
baos = ByteArrayOutputStream();
javaIObj.writeTo(baos);
输出流需要再次通过管道输入ByteArrayInputStream,它可用于构造ImageIO对象:
import java.io.ByteArrayInputStream;
import javax.imageio.ImageIO;
bais = ByteArrayInputStream(baos.toByteArray());
jbi = ImageIO.read(bais);
现在可以检索并显示实际的Matlab图像作为矩阵:
nrows = jbi.getHeight; ncols = jbi.getWidth;
data = jbi.getData.getPixels(0,0,ncols,nrows,[]);
matImg = reshape(data,ncols,nrows)';
imagesc(matImg);
我不知道这是否是完美的解决方案,但它对我有用。
干杯!