使用 xrange 减少内存使用,For 循环

Using xrange to Reduce Memory Usage, For Loop

我有一行代码产生了相当大的内存消耗。

这是一行:

X_train = (np.array(a).reshape(1000,100) for a in X_train)

简而言之,我正在重塑数据集的每一行。问题是,这会造成内存错误,导致我的内核在本地和 AWS 上崩溃。

如何使用 xrange 函数重写该行以减少内存使用?

(或任何其他可以减少内存使用的方法)

谢谢!!!

如@ali_m所述,该行本身就是一个生成器表达式。这意味着 X_train 的元素中的 none 会被求值,直到该生成器表达式的元素被求值为止。您必须评估 X_train 的所有元素并将它们存储在代码稍后某个位置的内存中,可能通过执行 list(X_train)、将 X_train 的每个元素附加到列表或类似的东西.这将在生成器表达式之前创建一个与原始 X_train 长度相等的列表,因此如果它太大会导致内存错误。

当生成器表达式仍在计算时,原始 X_train 无法被垃圾回收,因此通过创建新 X_train 的列表,您将创建两个巨大的列表,这可能就是为什么内存不足。

在这种情况下,您不能使用xrange来使您的代码更高效,因为它已经是一个生成器表达式。最好的办法是查看稍后在代码中如何使用 X_train 并尝试对其进行迭代 (for _ in X_train),而不是将其放入列表 (list(X_train))只要有可能。