相关疑难解决方法(0)

内存泄漏来自迭代Opencv帧

我正在使用OpenCV的java包装器.我试图在电影的帧上写一个迭代器.我的问题是迭代器是一个巨大的内存泄漏.这是迭代器的一个非常简化的版本,它有这个漏洞:

public static final class SimpleIt implements Iterator<Mat> {

    private final VideoCapture capture;
    boolean hasNext;

    public SimpleIt(final VideoCapture capture) {
        this.capture = capture;
        hasNext = capture.grab();
    }

    @Override
    public boolean hasNext() {
        return hasNext;
    }

    @Override
    public Mat next() {
        final Mat mat = new Mat();
        capture.retrieve(mat);
        hasNext = capture.grab();
        return mat;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用这个循环迭代这个代码:

    final VideoCapture vc = new VideoCapture("/path/to/file");
    final SimpleIt it = new SimpleIt(vc);
    while (it.hasNext) {
        it.next();
    }
Run Code Online (Sandbox Code Playgroud)

只是迭代会增加线性内存消耗.我看到问题是next() - Method中的第一行.它总是创造一个新的垫子.但是只谈到java,只要迭代代码迭代到下一个图像,这个Mat就会超出范围.

我可以通过不每次使用新的Mat来克服这个问题,但是总是覆盖相同的Mat-Object,如下所示:

    private final VideoCapture capture; …
Run Code Online (Sandbox Code Playgroud)

java opencv

14
推荐指数
5
解决办法
6888
查看次数

使用 POI 或 Tika 提取文本,流到流,无需在内存中加载整个文件

我正在尝试单独使用 Apache POI 和 PDFBox,或者在 Apache Tika 的上下文中,从 MASSIVE Microsoft Office 和 PDF 文件(即在某些情况下数百兆)中提取和处理纯文本。此外,我的应用程序是多线程的,因此我将同时解析许多这些大文件。

在这种规模下,我必须以流式方式处理文件。在此过程中的任何步骤都不能将整个文件保存在主内存中。

我见过许多通过输入流将文件加载到 Tika/POI/PDFBox 的源代码示例。我见过很多通过输出流提取纯文本的例子。但是,我已经执行了一些基本的内存分析实验......我还没有找到使用这些库(Tika、POI 或 PDFBox)中的任何一个的方法来避免将整个文档加载到主内存中。

在从流读取和写入流之间,中间显然有转换步骤......我还没有找到一种在流的基础上执行的方法。我是否遗漏了什么,或者这是使用 Tika/POI/PDFBox 从 MS Office 或 PDF 文件中提取文本的已知问题?我是否可以进行真正的端到端流传输,而不会在传输过程中的任何时候将文件完全加载到主内存中?

java ms-office apache-poi pdfbox apache-tika

1
推荐指数
1
解决办法
2544
查看次数

标签 统计

java ×2

apache-poi ×1

apache-tika ×1

ms-office ×1

opencv ×1

pdfbox ×1