在下面的示例中,我有一些关于内存使用的相关问题.
如果我在翻译中跑,
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"提前规划",认为你可能会再次使用那么多内存吗?
为什么它会50.5mb特别释放- 基于此发布的金额是多少?
有没有办法强制Python释放所有使用的内存(如果你知道你不会再使用那么多内存)?
注意
这个问题不同于我如何在Python中明确释放内存?
因为这个问题主要处理从基线增加内存使用量,即使在解释器通过垃圾收集(使用gc.collect或不使用)释放对象之后.
我有许多数据帧作为预处理的一部分创建.由于我有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) 这已在前面讨论过,但答案相互矛盾:
我想知道的是:
inplace = False默认行为?inplace = True?inplace = True操作是否"真正"就地进行?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问题放在一边,总是使用它似乎更高效.但这不是默认的熊猫选择,所以我错过了什么?
我试图迭代超过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) 我有一个唯一行列表和另一个更大的数据数组(在示例中称为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)
这打印...... …
我正在 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)
或者有更好的方法来实现这一目标?
假设我的计算机上保存了 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个放在同一个图上?(而不是次要情节)
谢谢 !
我有一个大型的熊猫数据框(696,20531),我想在直方图中绘制所有的值.使用df.plot(kind='hist')似乎是永远.有一个更好的方法吗?