如何修复 D "memory leaks"

How to fix D "memory leaks"

所以我一直在寻找解决这个问题的方法。我编写了一个程序来从两个单独的文本文件中获取数据,对其进行解析,然后输出到另一个文本文件和一个 ARFF 文件以供 Weka 分析。我遇到的问题 运行 是我编写的用于处理数据读取和解析操作的函数没有正确取消分配内存。每个连续的调用都会额外使用 100MB 左右,我需要在整个函数过程中调用此函数 60 多次。有没有办法强制 D 取消分配内存,特别是关于数组、动态数组和关联数组?

我的问题示例:

struct Datum {
     string Foo;
     int Bar;
} 

Datum[] Collate() {
    Datum[] data;
    int[] userDataSet;
    int[string] secondarySet;
    string[] raw = splitLines(readText(readFile)).dup;

    foreach (r; raw) {
        userDataSet ~= parse(r);
        secondarySet[r.split(",").dup] = parseSomeOtherWay(r);
    }

    data = doSomeOtherCalculation(userDataSet, secondarySet);

    return data;
}

返回数据中的字符串是否仍指向原始文本文件?

D 中的数组切片操作不会复制数据 - 相反,它们只存储指针和长度。这也适用于 splitLinessplit,可能还适用于 doSomeOtherCalculation。这意味着只要原始文件文本的子字符串存在于程序中的任何位置,就不能释放整个文件的内容。

如果您返回的数据只是您正在阅读的文本文件大小的一小部分,您可以使用 .dup 复制该字符串。这将防止小字符串将整个文件的内容固定在内存中。

如果Collate()结果的内容在调用后出现重复,很可能是GC没有回收,驻留在内存中,不再使用。如果是这样,那么您可以使用为每个 Collate():

重置的全局容器
void Collate(out Datum[] data) {
    // data content is cleared because of 'out' param storage class
    // your processing to fill data
}