通过Matlab和Java驱动程序从MongoDB(gridfs)读取数据

时间:2014-01-18 00:44:35

标签: java matlab mongodb gridfs

我正在使用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

1 个答案:

答案 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);

我不知道这是否是完美的解决方案,但它对我有用。

干杯!