使用 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)
)只要有可能。
我有一行代码产生了相当大的内存消耗。
这是一行:
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)
)只要有可能。