Python 如何减少多个重叠matplotlib loglog绘图的内存开销?
我有40个数据集,每个数据集的大小约为115MB,我想将它们全部绘制在同一个对数比例的绘图上Python 如何减少多个重叠matplotlib loglog绘图的内存开销?,python,matplotlib,Python,Matplotlib,我有40个数据集,每个数据集的大小约为115MB,我想将它们全部绘制在同一个对数比例的绘图上 # make example data import numpy as np data_x = [] data_y = [] for _ in range(40): x, y = np.random.random(size = (2, int(7e6))) # 7e6 chosen to make about 115MB size data_x.append(x) data_y
# make example data
import numpy as np
data_x = []
data_y = []
for _ in range(40):
x, y = np.random.random(size = (2, int(7e6))) # 7e6 chosen to make about 115MB size
data_x.append(x)
data_y.append(y)
del x, y
# now show the size of one set in MB
print((data_x[0].nbytes + data_y[0].nbytes)/1e6, 'MB')
# 112.0 MB
我的电脑有大约30GB的可用ram,所以我完全希望40*112MB=4.5GB的内存能够满足我的要求
我想为每个数据集绘制一个叠加的日志图:
import matplotlib.pyplot as plt
for x,y in zip(data_x, data_y):
plt.loglog(x, y)
plt.show()
但是内存开销太大了。
我不想减少数据的取样。有没有一种方法可以减少内存开销以绘制这4.5GB的数据
我更愿意保留for循环,因为我需要修改其中每个绘图的点样式和颜色,因此连接数据集是不利的
我能找到的最相似的问题是,但这不同于循环用于创建不同的绘图,而不是添加到同一绘图,因此将plt.clf命令添加到循环中对我没有帮助 以下是我解决您问题的尝试:
# make example data
import numpy as np
import matplotlib.pyplot as plt
import colorsys
data_x = np.random.random((40, int(7e6)))*np.logspace(0, 7, 40)[:, None]
data_y = np.random.random((40, int(7e6)))*np.logspace(0, 7, 40)[:, None]
# now show the size of one set in MB
print((data_x[0].nbytes + data_y[0].nbytes)/1e6, 'MB')
x, y = np.log(data_x), np.log(data_y)
hists = [np.histogram2d(x_, y_, bins=1000) for x_, y_ in zip(x,y)]
N = len(hists)
for i, h in enumerate(hists):
color = colorsys.hsv_to_rgb(i/N, 1, 1)
rows, cols = np.where(h[0]>0)
plt.scatter(h[1][rows], h[2][cols], color=color, s=1)
结果:
我获取x和y数据的日志,然后继续对其进行装箱。因为我不认为你对密度感兴趣,所以我只是画了一个静态颜色,其中一个箱子包含多个元素。这听起来像是过涂的定义。也许你应该把你的数据归档?没有办法,显示那么多的点会产生任何值是的,我的意思是我可以使用bin,但我必须使用指数增长的bin大小,因为我的数据跨越多个数量级。绝对不是一个快速而肮脏的解决方案。如果有一个干净的matplotlib功能来控制内存开销,例如,在上一次调用的png输出上按顺序打印,就会简单得多。我只是问社区是否存在一个选项。matplotlib如何使将4.5GB数据写入500x500像素图像的开销超过4.5GB?我只是在想我遗漏了什么……你可以预期matplotlib figure对象及其子对象会比数据的原始字节大小大得多。我不认为你遗漏了什么。您的数据太大,无法使用matplotlib打印。我肯定会考虑一些装箱。谢谢大家。我会追查的。请看你是否有时间。Thxthanks@user8408080-这确实有效!但我需要更多地控制垃圾箱的大小。如何更仔细地生成垃圾箱?我想要一个介于0和10之间的箱子,然后10个介于10^k和10^k+1}之间的箱子。对于所有的k>0,如中所述,您可以为箱子设置自己的边