何时关闭DL4J INDArrays

问题描述

我创建了一个自定义DataSetIterator。它的工作方式是在Indarray方法随机生成两个next一个用于输入,一个用于输出),并在其中创建一个DataSet

int[][] inputArray = new int[num][NUM_INPUTS];
int[][] expectedOutputArray = new int[num][];

for (int i = 0; i < num; i++) {//just fill the arrays with some data
    int sum = 0;
    int product = 1;
    for (int j = 0; j < inputArray[i].length; j++) {
        inputArray[i][j] = rand.nextInt();
        sum += inputArray[i][j];
        product *= inputArray[i][j];
    }
    expectedOutputArray[i] = new int[] { sum,product,sum / inputArray[i].length };
}

Indarray inputs = Nd4j.createFromArray(inputArray);//never closed
Indarray desiredOutputs = Nd4j.createFromArray(expectedOutputArray);//never closed
return new DataSet(inputs,desiredOutputs);

但是,INDArray实现了AutoClosablejavadoc for close() states

方法释放此Indarray实例使用的专用堆外资源。如果Indarray依赖共享资源,则将引发异常,请注意:此方法绝对不安全

我尝试使用try-with-resources,但是由于在Indarray方法中使用fit时已关闭 protected override async void OnInitialized() { try { InitializeComponent(); if (DataContext.GetContext().CurrentUser == null) { if ((await NavigationService.NavigateAsync(nameof(LoginScreen))).Exception is Exception e) throw e; } else { if ((await NavigationService.NavigateAsync("NavigationPage/MainScreen")).Exception is Exception e) throw e; } } catch (Exception ex) { Debug.WriteLine($"[ERR] in {nameof(OnInitialized)}"); Debug.WriteLine(ex.Message); await UserDialogs.Instance.AlertAsync(AppResources.Error_Label); } ,因此引发了异常。

documentation of createFromArray(int[][])似乎无法解释这一点。

解决方法

您实际上不需要关闭它们。我们使用javacpp自动处理。您可以 选择关闭它们,但对那些希望对ndarray的内存管理有更多控制权的人实现了AutoCloseable。

编辑:Javacpp是基础的本机集成,我们用于连接到我们以c ++和其他库编写的本机库。我们所有的计算和数据都基于本机代码和堆外内存。 close()只是迫使我们更快地取消分配那些缓冲区。 Javacpp已经内置了自动取消分配功能。