【发布时间】:2016-10-15 16:16:07
【问题描述】:
我有两个不同的 numpy 数组,我想以异步方式对它们进行洗牌。
当前的解决方案取自https://www.tensorflow.org/versions/r0.8/tutorials/mnist/pros/index.html,如下:
perm = np.arange(self.no_images_train)
np.random.shuffle(perm)
self.images_train = self.images_train[perm]
self.labels_train = self.labels_train[perm]
问题是每次我这样做都会使内存翻倍。不知何故,旧数组没有被删除,可能是因为切片运算符创建了我猜的视图。出于纯粹的绝望,我尝试了以下更改:
perm = np.arange(self.no_images_train)
np.random.shuffle(perm)
n_images_train = self.images_train[perm]
n_labels_train = self.labels_train[perm]
del self.images_train
del self.labels_train
gc.collect()
self.images_train = n_images_train
self.labels_train = n_labels_train
还是一样,内存泄漏,我在几次操作后内存不足。
顺便说一句,这两个数组的秩分别为 100000,224,244,1 和 100000,1。
我知道这已在此处处理 (Better way to shuffle two numpy arrays in unison),但答案对我没有帮助,因为提供的解决方案需要再次切片。
感谢您的帮助。
【问题讨论】:
-
那些不是视图。您可能在某处对原始数组有其他引用。
-
"...因为切片运算符创建视图我猜。"切片确实创建视图,但您显示的代码不是切片.当您写
a[perm]时,会生成一份副本。 “切片”是指使用冒号的操作:start:end:step,例如0:4、4:等 -
"... 以异步方式。" 我认为您缺少一个空格。根据以下内容,我认为您的意思是“以同步方式”。
-
"...rank 100000,224,244,1..." 差不多是 5.5 GB(假设数据类型是 8 位)。即使在您的“绝望”代码中,有时
self.images_train和 `n_images_train" 也会同时存在,这将需要 11 GB。这不是内存“泄漏”。 -
我认为这个问题的一个更好的标题是“如何将相同的随机排列应用于两个数组而不制作数组的临时副本?”
标签: python arrays numpy memory-leaks slice