使用WebClient.OpenWrite 方法 (String, String)这个的时候出现了内存溢出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用WebClient.OpenWrite 方法 (String, String)这个的时候出现了内存溢出相关的知识,希望对你有一定的参考价值。
大文件上传到文件服务器的时候,上传到web服务器已经完成,但是在从未web服务器将文件上传到文件服务器的时候出现了内存溢出。不知道是不是WebClient.OpenWrite这个方法在web服务器中建立了一个镜像。
具体代码如下
private static void UploadFileWithoutPrepareDirectory(Stream stream, string targetUrl, ICredentials credentials)
WebClient client = new WebClient
Credentials = credentials ?? CredentialCache.DefaultCredentials
;
using (Stream stream2 = client.OpenWrite(targetUrl, "PUT"))
byte[] buffer = new byte[BlockSize];
int count = 0;
while ((count = stream.Read(buffer, 0, BlockSize)) > 0)
stream2.Write(buffer, 0, count);
在本机进行调试的时候上传1G都没问题。但是在生产环境上传200M都有时候出现问题。本机内存6G,生产环境给到的内存可能不足300M。
主要引发的异常有2个
1、引发类型为“System.OutOfMemoryException”的异常。
2、基础连接已经关闭: 无法连接到远程服务器。(这个是在USING关闭的时候报的)
这个是设置为10M的
Python 装饰器使用静态方法。但使用 2 个静态方法失败。为啥?
【中文标题】Python 装饰器使用静态方法。但使用 2 个静态方法失败。为啥?【英文标题】:Python decorator works with staticmethod. But fails with 2 static methods. Why?Python 装饰器使用静态方法。但使用 2 个静态方法失败。为什么? 【发布时间】:2016-02-17 04:23:27 【问题描述】:这是我的 Python 代码。我有一个类MyClass
有两个静态方法:my_method1
和my_method2
。这两种方法都使用名为 exception_handler
的装饰器包装。
from functools import wraps
import sys
def exception_handler(function):
@wraps(function)
def decorator(self, *args, **kwargs):
try:
return function(self, *args, **kwargs)
except Exception, e:
print "EXCEPTION!: %s" % e
sys.exit(-1)
return decorator
class MyClass:
@staticmethod
@exception_handler
def my_method1(a, b, c,):
return "X"
@staticmethod
@exception_handler
def my_method2(e, f, g,):
print "Y"
return MyClass.my_method1(a=e, b=f, c=g)
print "Trying my_method1"
print MyClass.my_method1(1, 2, 3)
print ""
print "Trying my_method2"
print MyClass.my_method2(1, 2, 3)
当我运行这段代码时,我得到以下信息:
Trying my_method1
X
Trying my_method2
Y
EXCEPTION!: decorator() takes at least 1 argument (0 given)
为什么装饰器在第二种情况下会失败,我该如何解决?
当装饰方法是被另一个静态方法调用的静态方法时,装饰器似乎失败了。但是为什么会发生这种情况对我来说毫无意义。
【问题讨论】:
为什么内部函数中有一个“自我”?静态方法不会将 self 或 cls 作为第一个参数except Exception, e:
:如果可能,请使用except Exception as e:
。这个语法一直是deprecated since Python 2.6。
奥兹。此装饰器旨在用于静态方法和非静态类方法。它对两者都有效......直到我尝试从另一个包装的静态方法中调用一个包装的静态方法。
感谢 Evert 指出这一点。我会做出改变。
【参考方案1】:
问题在于staticmethods
没有将self 作为参数。我不确定为什么它适用于前两个电话而不是第三个电话。但是,从装饰器中删除 self
可以修复它。
这是重构后的代码:
from functools import wraps
import sys
def exception_handler(function):
@wraps(function)
def decorator(*args, **kwargs):
try:
return function(*args, **kwargs)
except Exception as e:
print "EXCEPTION!: ".format(e)
sys.exit(-1)
return decorator
class MyClass(object):
@staticmethod
@exception_handler
def my_method1(a, b, c, ):
return "X"
@staticmethod
@exception_handler
def my_method2(e, f, g, ):
print "Y"
return MyClass.my_method1(a=e, b=f, c=g)
print "Trying my_method1"
print MyClass.my_method1(1, 2, 3)
print
print "Trying my_method2"
print MyClass.my_method2(1, 2, 3)
这样做会产生以下结果:
Trying my_method1
X
Trying my_method2
Y
X
【讨论】:
所以我想要一个这样的装饰器,用于静态和非静态方法的异常处理。我只需要两个不同的装饰器吗? 是的。否则,您将需要像这样调用静态方法:MyClass.my_method1(_, 1, 2, 3)
...【参考方案2】:
我认为您的代码在您没有注意到的情况下失败了,您可以尝试打印您的 a, b, c
*args 吗?你会发现a
是self
!!!所以它通过分配错误的参数默默地失败。
那么为什么它在这里第二次调用时引发异常:MyClass.my_method1(a=e, b=f, c=g)
那是因为你的 *args 现在是空的,并且 self 不能像以前那样替换任何变量。
【讨论】:
以上是关于使用WebClient.OpenWrite 方法 (String, String)这个的时候出现了内存溢出的主要内容,如果未能解决你的问题,请参考以下文章
Java集合使用之next方法与remove方法 | Java集合使用之remove方法使用易错