请考虑以下代码:
import numpy as np
a = np.zeros(50)
a[10:20:2] = 1
b = c = a[10:40:4]
print b.flags # You'll see that b and c are not C_CONTIGUOUS or F_CONTIGUOUS
Run Code Online (Sandbox Code Playgroud)
我的问题:
有没有办法(只有参考b)来制作b和c连续?如果在此操作之后np.may_share_memory(b,a)返回,则完全正常False.
接近但不太合理的事情是: np.ascontiguousarray/ np.asfortranarray因为它们会返回一个新阵列.
我的用例是我有一个非常大的3D字段存储在a的子类中numpy.ndarray.为了节省内存,我想将这些字段切换到我实际感兴趣处理的域的部分:
a = a[ix1:ix2,iy1:iy2,iz1:iz2]
Run Code Online (Sandbox Code Playgroud)
对子类进行切片比切片ndarray对象更受限制,但这应该有效,它将"做正确的事" - 子类上附加的各种自定义元数据将按预期进行转换/保留.不幸的是,由于这会返回a view,numpy之后不会释放大数组,所以我实际上并没有在这里保存任何内存.
要完全清楚,我希望完成两件事:
我在RESTful Web服务中使用Cherrypy,服务器返回XML(lxml用于创建XML).其中一些XML非常庞大.我注意到在处理了这样的请求(返回大型XML)之后,内存没有被释放.
所以,我已经隔离了一个问题并创建了一个非常简短的虚拟示例:
import cherrypy
from lxml import etree
class Server:
@cherrypy.expose
def index(self):
foo = etree.Element('foo')
for i in range(200000):
bar = etree.SubElement(foo, 'bar')
bar1 = etree.SubElement(bar, 'bar1')
bar1.text = "this is bar1 text ({0})".format(i)
bar2 = etree.SubElement(bar, 'bar2')
bar2.text = "this is bar2 text ({0})".format(i)
bar3 = etree.SubElement(bar, 'bar3')
bar3.text = "this is bar3 text ({0})".format(i)
bar4 = etree.SubElement(bar, 'bar4')
bar4.text = "this is bar4 text ({0})".format(i)
bar5 = etree.SubElement(bar, 'bar5')
bar5.text = "this is bar5 text ({0})".format(i) …Run Code Online (Sandbox Code Playgroud) 流行的python mysql模块"MySQLdb"似乎有内存泄漏问题.这是代码:
conn = MySQLdb.connect(...)
cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
sql = "select * from `test`"
cursor.execute(sql) #leak start
cursor.close()
conn.close()
time.sleep(20)
Run Code Online (Sandbox Code Playgroud)
假设这test是一个有十亿条记录的表.我运行了python代码并执行
ps aux | awk '{print $2, $4, $11}' | grep python
Run Code Online (Sandbox Code Playgroud)
同时,结果是内存使用增加到47.0%并且永远不会回头,即使我关闭光标和conn.有任何想法吗?
我有类似于此的代码:
def memoryIntensiveFunction(x):
largeTempVariable = Intermediate(x)
processFunction(largeTempVariable,x)
Run Code Online (Sandbox Code Playgroud)
问题在于,temp在我的测试用例中,该变量类似于 500 mb,但该空间在memoryIntensiveFunction完成后不会返回给操作系统。我知道这是因为使用该guppy工具进行的内存分析说largeTempVariable已释放(即,在 Python 中),但psutil表明它不是。我想我看到了这里描述的效果。问题是这个过程运行时间很长(即几个小时),memoryIntensiveFunction在开始时运行并且永远不会再次运行,所以我不得不携带 500mb 几个小时很不方便。
我在这里和这里找到的一个解决方案建议使用单独的过程。多处理会产生自己的成本,但就我而言,这是值得的。但是,这需要重构memoryIntensiveFunction调用者以接收x返回值,而不是看到它就地修改。真正的杀手是我的对象x不可选择(它大量使用了 boost python 扩展)。使可x腌制的工作量很大。
有没有我没有考虑的选项?
这不是作为错误报告的目的——即使这些泄漏可能是 mpl 错误的结果,请解释问题要求寻求解决方法。
问题很简单:绘制大量数据(使用 plot() 或 scatter()),清除/释放所有内容,垃圾收集,但仍然没有释放几乎所有内存。
Line # Mem usage Increment Line Contents
================================================
391 122.312 MiB 0.000 MiB @profile
392 def plot_network_scatterplot(t_sim_stop, spikes_mat, n_cells_per_area, n_cells, basedir_output, condition_idx):
393
394 # make network scatterplot
395 122.312 MiB 0.000 MiB w, h = plt.figaspect(.1/(t_sim_stop/1E3))
396 122.324 MiB 0.012 MiB fig = mpl.figure.Figure(figsize=(10*w, 10*h))
397 122.328 MiB 0.004 MiB canvas = FigureCanvas(fig)
398 122.879 MiB 0.551 MiB ax = fig.add_axes([.01, .1, .98, .8])
399 134.879 MiB 12.000 MiB edgecolor_vec = np.array([(1., …Run Code Online (Sandbox Code Playgroud) 我必须加载A需要传递给函数的这个庞大的对象(可以加权10ms的权重),该函数从中提取参数B以进一步对其施加大量计算。
A = load(file)
def function(A):
B = transorm(A)
B = compute(B)
return(B)
Run Code Online (Sandbox Code Playgroud)
为了释放一些内存(因为我已经遇到了MemoryError),我想在将A其转换为B后立即从内存中删除。我尝试过,del但它似乎并不影响A脚本级别的存在。我也尝试过,del global()["A"]但是它说A没有定义为全局变量。
有办法吗?谢谢!
我有一段 python 代码,它会MemoryError在一段时间后生成。我知道它会消耗大量内存。所以,我决定把代码放在一个try/except块中,这样骨架看起来像下面这样:
while True:
while True:
try:
#---- do some stuff
except MemoryError as err:
print(err)
break
Run Code Online (Sandbox Code Playgroud)
所以,我的想法是while在 aMemoryError发生时跳出第一个循环,因为我有一个外部while循环,它将再次启动程序。
似乎它暂时有效,但我不确定。过了一会儿,它再次停止,我需要再次重新启动程序。有人知道更好的解决方案,以便程序可以MemoryError再次运行吗?
从包含约 1500 万行(占用约 250 MB)的 pickle 加载数据帧后,我对其执行了一些搜索操作,然后就地删除了一些行。在这些操作期间,内存使用量猛增至 5 GB,有时甚至 7 GB,这很烦人,因为交换(我的笔记本电脑只有 8 GB 内存)。
关键是当操作完成时(即执行下面代码中的最后两行时),该内存不会被释放。所以 Python 进程仍然占用高达 7 GB 的内存。
知道为什么会这样吗?我正在使用 Pandas 0.20.3。
下面的最小示例。'data' 变量实际上有大约 1500 万行,但我不知道如何在这里发布它。
import datetime, pandas as pd
data = {'Time':['2013-10-29 00:00:00', '2013-10-29 00:00:08', '2013-11-14 00:00:00'], 'Watts': [0, 48, 0]}
df = pd.DataFrame(data, columns = ['Time', 'Watts'])
# Convert string to datetime
df['Time'] = pd.to_datetime(df['Time'])
# Make column Time as the index of the dataframe
df.index = df['Time']
# Delete the column time
df = df.drop('Time', …Run Code Online (Sandbox Code Playgroud) 我有一个在Elastic Beanstalk上运行的芹菜工作者,它轮询SQS队列,获取消息(包含S3文件名),从S3下载这些文件并处理它们.我的工作人员计划每15秒运行一次,但由于某种原因,内存使用量会随着时间的推移而不断增加.
这是我用来访问SQS的代码
def get_messages_from_sqs(queue_url, queue_region="us-west-2", number_of_messages=1):
client = boto3.client('sqs', region_name=queue_region)
sqs_response = client.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=number_of_messages)
messages = sqs_response.get("Messages", [])
cleaned_messages = []
for message in messages:
body = json.loads(message["Body"])
data = body["Records"][0]
data["receipt_handle"] = message["ReceiptHandle"]
cleaned_messages.append(data)
return cleaned_messages
def download_file_from_s3(bucket_name, filename):
s3_client = boto3.client('s3')
s3_client.download_file(bucket_name, filename, '/tmp/{}'.format(filename))
Run Code Online (Sandbox Code Playgroud)
我有 6 个大数据 tsv 文件,我正在将这些文件读入 Google Collab 中的数据帧。但是,文件太大,Google Colab 无法处理。
#Crew data
downloaded = drive.CreateFile({'id':'16'})
downloaded.GetContentFile('title.crew.tsv')
df_crew = pd.read_csv('title.crew.tsv',header=None,sep='\t',dtype='unicode')
#Ratings data
downloaded = drive.CreateFile({'id':'15'})
downloaded.GetContentFile('title.ratings.tsv')
df_ratings = pd.read_csv('title.ratings.tsv',header=None,sep='\t',dtype='unicode')
#Episode data
downloaded = drive.CreateFile({'id':'14'})
downloaded.GetContentFile('title.episode.tsv')
df_episode = pd.read_csv('title.episode.tsv',header=None,sep='\t',dtype='unicode')
#Name Basics data
downloaded = drive.CreateFile({'id':'13'})
downloaded.GetContentFile('name.basics.tsv')
df_name = pd.read_csv('name.basics.tsv',header=None,sep='\t',dtype='unicode')
#Principals data
downloaded = drive.CreateFile({'id':'12'})
downloaded.GetContentFile('title.pricipals.tsv')
df_principals = pd.read_csv('title.pricipals.tsv',header=None,sep='\t',dtype='unicode')
#Title Basics data
downloaded = drive.CreateFile({'id':'11'})
downloaded.GetContentFile('title.basics.tsv')
df_title = pd.read_csv('title.basics.tsv',header=None,sep='\t',dtype='unicode')
Run Code Online (Sandbox Code Playgroud)
错误:您的会话在使用所有可用 RAM 后崩溃。运行时日志是这样说的:

Google Collab 如何更好地处理 Ram?我所有 tsv 文件的总大小为 2,800 MB。请指教!
python ×9
memory ×5
dataframe ×2
memory-leaks ×2
pandas ×2
boto3 ×1
celery ×1
cherrypy ×1
consumption ×1
del ×1
django ×1
lxml ×1
matplotlib ×1
mysql ×1
numpy ×1
optimization ×1
psutil ×1
python-2.7 ×1