何时关闭 DL4J INDArrays
When to close DL4J INDArrays
我创建了一个自定义 DataSetIterator
。它通过在 next
方法中随机生成两个 INDArray
(一个用于输入,一个用于输出)并从中创建一个 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
implements AutoClosable
and the javadoc for close()
states:
This method releases exclusive off-heap resources uses by this INDArray instance. If INDArray relies on shared resources, exception will be thrown instead PLEASE NOTE: This method is NOT safe by any means
我需要关闭 INDArray
吗?
如果是这样,我什么时候需要关闭 INDArray
s?
我尝试使用 try-with-resources 但它引发了异常,因为在 fit
方法中使用它时 INDArray
被关闭。
你真的不需要关闭它们。我们使用 javacpp 自动处理这个问题。您可以选择关闭它们,但 AutoCloseable 是为那些希望更好地控制 ndarray 的内存管理的人实现的。
编辑:Javacpp 是我们用来连接到我们维护的用 c++ 和其他库编写的本机库的基础本机集成。我们所有的计算和数据都是基于原生代码和堆外内存。
close() 只是迫使我们更快地取消分配这些缓冲区。不过,Javacpp 已经内置了自动取消分配。
我创建了一个自定义 DataSetIterator
。它通过在 next
方法中随机生成两个 INDArray
(一个用于输入,一个用于输出)并从中创建一个 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
implements AutoClosable
and the javadoc for close()
states:
This method releases exclusive off-heap resources uses by this INDArray instance. If INDArray relies on shared resources, exception will be thrown instead PLEASE NOTE: This method is NOT safe by any means
我需要关闭
INDArray
吗?如果是这样,我什么时候需要关闭
INDArray
s?
我尝试使用 try-with-resources 但它引发了异常,因为在 fit
方法中使用它时 INDArray
被关闭。
你真的不需要关闭它们。我们使用 javacpp 自动处理这个问题。您可以选择关闭它们,但 AutoCloseable 是为那些希望更好地控制 ndarray 的内存管理的人实现的。
编辑:Javacpp 是我们用来连接到我们维护的用 c++ 和其他库编写的本机库的基础本机集成。我们所有的计算和数据都是基于原生代码和堆外内存。 close() 只是迫使我们更快地取消分配这些缓冲区。不过,Javacpp 已经内置了自动取消分配。