相关疑难解决方法(0)

在Python中释放内存

在下面的示例中,我有一些关于内存使用的相关问题.

  1. 如果我在翻译中跑,

    foo = ['bar' for _ in xrange(10000000)]
    
    Run Code Online (Sandbox Code Playgroud)

    我机器上使用的真实内存最多80.9mb.然后,我

    del foo
    
    Run Code Online (Sandbox Code Playgroud)

    真正的记忆力下降,但仅限于30.4mb.解释器使用4.4mb基线,那么不26mb向OS 释放内存的优势是什么?是因为Python"提前规划",认为你可能会再次使用那么多内存吗?

  2. 为什么它会50.5mb特别释放- 基于此发布的金额是多少?

  3. 有没有办法强制Python释放所有使用的内存(如果你知道你不会再使用那么多内存)?

注意 这个问题不同于我如何在Python中明确释放内存? 因为这个问题主要处理从基线增加内存使用量,即使在解释器通过垃圾收集(使用gc.collect或不使用)释放对象之后.

python memory-management

122
推荐指数
4
解决办法
12万
查看次数

如何从内存中删除多个pandas(python)数据帧以节省RAM?

我有许多数据帧作为预处理的一部分创建.由于我有6GB内存限制,我想从RAM中删除所有不必要的数据帧,以避免在scikit-learn中运行GRIDSEARCHCV时内存不足.

1)是否只有列出的功能,当前加载到内存中的所有数据帧?

我尝试了dir()但它提供了许多除dataframe之外的其他对象.

2)我创建了一个要删除的数据帧列表

del_df=[Gender_dummies,
 capsule_trans,
 col,
 concat_df_list,
 coup_CAPSULE_dummies]
Run Code Online (Sandbox Code Playgroud)

跑了

for i in del_df:
    del (i)
Run Code Online (Sandbox Code Playgroud)

但它没有删除数据帧.但是,像下面一样删除数据帧是从内存中删除数据帧.

del Gender_dummies
del col
Run Code Online (Sandbox Code Playgroud)

python ram memory-management dataframe pandas

34
推荐指数
3
解决办法
11万
查看次数

熊猫 - 就位=真正被认为有害或无效?

这已在前面讨论过,但答案相互矛盾:

我想知道的是:

  • 为什么是inplace = False默认行为?
  • 什么时候改变呢?(好吧,我被允许改变它,所以我猜这是有原因的).
  • 这是安全问题吗?也就是说,操作失败/行为失误是由于inplace = True?
  • 我是否可以提前知道某项inplace = True操作是否"真正"就地进行?

我到目前为止:

  • 许多Pandas操作都有一个inplace参数,总是默认为False,意味着原始的DataFrame不受影响,并且操作返回一个新的DF.
  • 设置时inplace = True,操作可能适用于原始DF,但它可能仍在幕后复制,只需在完成后重新分配参考.

专业人士inplace = False:

  • 允许链接/功能语法:df.dropna().rename().sum()...这很好,并提供延迟评估或更有效的重新排序的机会(虽然我不认为Pandas正在这样做).
  • 当inplace = True在可能是底层DF的切片/视图的对象上使用时,Pandas必须进行SettingWithCopy检查,这是昂贵的.inplace = False避免这种情况.
  • 幕后一致且可预测的行为.

专业人士inplace = True:

  • 可以更快,更少内存占用(第一个链接显示reset_index()运行速度快两倍,并使用峰值内存的一半!).

因此,inplace = True除了专门编写链式语句之外,将copy-vs-view问题放在一边,总是使用它似乎更高效.但这不是默认的熊猫选择,所以我错过了什么?

python pandas

27
推荐指数
2
解决办法
7444
查看次数

如何销毁Python对象并释放内存

我试图迭代超过100,000个图像并捕获一些图像功能,并将所得的dataFrame作为pickle文件存储在磁盘上。

不幸的是,由于RAM的限制,我被迫将图像分成20,000个大块并对其进行操作,然后再将结果保存到磁盘上。

在开始循环以处理下一个20,000图像之前,下面编写的代码应该保存20,000图像的结果数据框。

但是-这似乎没有解决我的问题,因为在第一个for循环结束时内存没有从RAM中释放

因此,在处理第50,000条记录时,该程序由于内存不足错误而崩溃。

在将对象保存到磁盘并调用垃圾收集器后,我尝试删除这些对象,但是RAM使用率似乎并未下降。

我想念什么?

#file_list_1 contains 100,000 images
file_list_chunks = list(divide_chunks(file_list_1,20000))
for count,f in enumerate(file_list_chunks):
    # make the Pool of workers
    pool = ThreadPool(64) 
    results = pool.map(get_image_features,f)
    # close the pool and wait for the work to finish 
    list_a, list_b = zip(*results)
    df = pd.DataFrame({'filename':list_a,'image_features':list_b})
    df.to_pickle("PATH_TO_FILE"+str(count)+".pickle")
    del list_a
    del list_b
    del df
    gc.collect()
    pool.close() 
    pool.join()
    print("pool closed")
Run Code Online (Sandbox Code Playgroud)

python memory-management out-of-memory pandas

13
推荐指数
1
解决办法
1446
查看次数

什么是更快捷的方式来获取numpy中唯一行的位置

我有一个唯一行列表和另一个更大的数据数组(在示例中称为test_rows).我想知道是否有更快的方法来获取数据中每个唯一行的位置.我能想到的最快的方法是......

import numpy


uniq_rows = numpy.array([[0, 1, 0],
                         [1, 1, 0],
                         [1, 1, 1],
                         [0, 1, 1]])

test_rows = numpy.array([[0, 1, 1],
                         [0, 1, 0],
                         [0, 0, 0],
                         [1, 1, 0],
                         [0, 1, 0],
                         [0, 1, 1],
                         [0, 1, 1],
                         [1, 1, 1],
                         [1, 1, 0],
                         [1, 1, 1],
                         [0, 1, 0],
                         [0, 0, 0],
                         [1, 1, 0]])

# this gives me the indexes of each group of unique rows
for row in uniq_rows.tolist():
    print row, numpy.where((test_rows == row).all(axis=1))[0]
Run Code Online (Sandbox Code Playgroud)

这打印...... …

python numpy scipy

7
推荐指数
1
解决办法
507
查看次数

删除并释放单个 pandas dataframe 的内存

我正在 pandas 中运行一个很长的 ETL 管道。我必须创建不同的 pandas 数据帧,并且我想释放某些数据帧的内存。

我一直在阅读如何释放内存,我发现运行此命令不会释放内存:

del dataframe
Run Code Online (Sandbox Code Playgroud)

点击此链接:如何从内存中删除多个 pandas (python) 数据帧以节省 RAM?,答案之一说 del 语句不会删除实例,它只是删除一个名称。

在答案中,他们说将数据帧放入列表中,然后删除列表:

lst = [pd.DataFrame(), pd.DataFrame(), pd.DataFrame()]
del lst  
Run Code Online (Sandbox Code Playgroud)

如果我只想释放一个数据帧,我需要将其放入一个列表中,然后删除一个列表,如下所示:

lst = [pd.DataFrame()]
del lst
Run Code Online (Sandbox Code Playgroud)

我也看到了这个问题:How do Irelease memoryused by a pandas dataframe?

有不同的答案,例如:

import gc
del df_1
gc.collect()
Run Code Online (Sandbox Code Playgroud)

或者

就在数据框使用结束时

df = ""
Run Code Online (Sandbox Code Playgroud)

或者有更好的方法来实现这一目标?

python memory pandas

7
推荐指数
1
解决办法
3万
查看次数

从大型数据集增量构建箱线图

假设我的计算机上保存了 4 个文件作为 .npz 文件:W、X、Y 和 Z。假设我的计算机在 RAM 消耗方面无法承受同时加载多个文件。

我怎样才能运行这个命令?:

 matplotlib.pyplot.boxplot([W],[X],[Y],[Z])
Run Code Online (Sandbox Code Playgroud)

换句话说,我如何加载W,绘制W,删除W,然后加载Y,绘制Y,删除Y,...并将它们中的4个放在同一个图上?(而不是次要情节)

谢谢 !

python ram plot matplotlib

5
推荐指数
1
解决办法
2662
查看次数

绘制一个非常大的熊猫数据帧的最佳方法是什么?

我有一个大型的熊猫数据框(696,20531),我想在直方图中绘制所有的值.使用df.plot(kind='hist')似乎是永远.有一个更好的方法吗?

python matplotlib pandas

5
推荐指数
2
解决办法
944
查看次数