相关疑难解决方法(0)

numpy - 将非连续数据转换为适当的连续数据

请考虑以下代码:

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)来制作bc连续?如果在此操作之后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之后不会释放大数组,所以我实际上并没有在这里保存任何内存.

要完全清楚,我希望完成两件事:

  • 保留我的类实例上的元数据.切片会起作用,但我不确定其他形式的复制.
  • 使它成为原始数组可以自由收集垃圾

python numpy

6
推荐指数
2
解决办法
2382
查看次数

Cherrypy中的内存消耗

我在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 memory lxml cherrypy consumption

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

Python MySQLdb模块内存泄漏

流行的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.有任何想法吗?

python mysql memory-leaks

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

将内存从 Python 释放回操作系统的方法?

我有类似于此的代码:

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腌制的工作量很大。

有没有我没有考虑的选项?

python garbage-collection multiprocessing python-2.7 psutil

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

使用 matplotlib 的内存泄漏

这不是作为错误报告的目的——即使这些泄漏可能是 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)

memory memory-leaks matplotlib

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

Python-从函数内部删除(从内存中删除)变量?

我必须加载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 memory optimization global-variables del

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

如何处理 Python 代码中的“MemoryError”

我有一段 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再次运行吗?

python exception-handling

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

Pandas - 巨大的内存消耗

从包含约 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)

python memory dataframe pandas

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

在boto3中诊断内存泄漏

我有一个在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)

完成这个过程后,我们是否需要在boto3中关闭客户端连接?如果是这样,我们怎么做呢? 内存监控图

python memory django celery boto3

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

使用 Google 协作中的所有可用 RAM 后,您的会话崩溃

我有 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 dataframe pandas google-colaboratory

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