据说Python自动管理内存.我很困惑,因为我有一个Python程序一直使用超过2GB的内存.
它是一个简单的多线程二进制数据下载器和解包器.
def GetData(url):
req = urllib2.Request(url)
response = urllib2.urlopen(req)
data = response.read() // data size is about 15MB
response.close()
count = struct.unpack("!I", data[:4])
for i in range(0, count):
UNPACK FIXED LENGTH OF BINARY DATA HERE
yield (field1, field2, field3)
class MyThread(threading.Thread):
def __init__(self, total, daterange, tickers):
threading.Thread.__init__(self)
def stop(self):
self._Thread__stop()
def run(self):
GET URL FOR EACH REQUEST
data = []
items = GetData(url)
for item in items:
data.append(';'.join(item))
f = open(filename, 'w')
f.write(os.linesep.join(data))
f.close()
Run Code Online (Sandbox Code Playgroud)
有15个线程正在运行.每个请求获取15MB数据并将其解压缩并保存到本地文本文件中.该程序如何消耗超过2GB的内存?在这种情况下,我是否需要进行任何内存回收工作?如何查看每个对象或函数使用多少内存?
我将非常感谢您提供有关如何使python程序以内存高效模式运行的所有建议或提示.
编辑:这是"cat/proc/meminfo"的输出
MemTotal: …Run Code Online (Sandbox Code Playgroud) 它在DEBUG = True模式下运行.有时它会在遇到错误时抛出带有回溯信息的错误消息,但有时它只显示以下行:
Unhandled Exception
An unhandled exception was thrown by the application.
Run Code Online (Sandbox Code Playgroud)
我必须切换到开发服务器才能看到详细消息.
如何在遇到错误时始终显示回溯消息?
我有一个1.9GB的MySQL innodb数据库,通过以下命令显示.
SELECT table_schema "Data Base Name"
, sum( data_length + index_length ) / 1 048 576
as "Data Base Size in MB"
, sum( data_free )/ 1 048 576
as "Free Space in MB"
FROM information_schema.TABLES
GROUP BY table_schema ;
+--------------------+----------------------+------------------+
| Data Base Name | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| database_name | 1959.73437500 | 31080.00000000 |
Run Code Online (Sandbox Code Playgroud)
我的问题是:
这是否意味着,如果我将innodb_buffer_pool_size为2GB或更大,整个数据库可以加载到内存中,因此从磁盘读取请求少得多的需要?
31GB的可用空间是什么意思?
如果最大RAM可分配给innodb_buffer_pool_size为1GB,是它可以指定哪些表加载到内存,同时防止其他人总是从磁盘读取?
提前致谢.
在执行以下代码时,它抛出"UnicodeDecodeError:'ascii'编解码器无法解码位置2中的字节0xc2:序号不在范围内(128)":
filename = 'Spywaj.ttf'
print repr(filename)
>> 'Sp\xc2\x88ywaj.ttf'
filepath = os.path.join('/dirname', filename)
Run Code Online (Sandbox Code Playgroud)
但该文件有效并存在于磁盘上.文件名是从"unzip -l"命令中提取的.如何加入这样的文件名?
操作系统和文件系统
Filesystem: ext3 relatime,errors=remount-ro 0 0
Locale: en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
Alex的建议 os.path.join现在可以工作,但我仍然无法使用它加入的文件名访问磁盘上的文件.
filename = filename.decode('utf-8')
filepath = os.path.join('/dirname', filename)
print filepath
>> /dirname/u'Sp\xc2\x88ywaj.ttf'
print os.path.isfile(filepath)
>> False
new_filepath = filepath.encode('Latin-1').encode('utf-8')
print new_filepath
>> /dirname/u'Sp\xc2\x88ywaj.ttf'
print type(filepath)
>> <type 'unicode'>
print os.path.isfile(new_filepath)
>> False
valid_filepath = glob.glob('/dirname/*.ttf')[0]
print valid_filepath
>> /dirname/Spywaj.ttf (SO cannot display the chars in filename)
print type(valid_filepath)
>> <type 'str'>
print os.path.isfile(valid_filepath)
>> True
Run Code Online (Sandbox Code Playgroud) 我有一个包含大约30个表的数据库,其中5个表是写密集型的.
我在考虑
转换5个写密集型表以使用InnoDB引擎,并将其余部分保留在MyISAM引擎上
转换所有表以使用InnoDB引擎.
我想知道哪种方法更好?
更具体
我想在MyISAM引擎上保留一些表的原因是它们中的一些有大约1,000,000行.我不确定转换为InnoDB后这些表上的"SELECT COUNT(*)"查询会有多慢.
我没有做过测试.在开始转换之前,我更喜欢从你们这里得到一些建议.
我以前使用下面的代码将IPv4地址绑定到Python套接字作为源IP地址.
import socket
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind((sourceIP, 0))
return sock
socket.socket = bound_socket
Run Code Online (Sandbox Code Playgroud)
上面的代码是否适用于IPv6地址?如果没有,我如何绑定IPv6地址?
提前致谢!
我只想在Django项目中开发一个翻译应用程序,使具有特定权限的注册用户能够翻译它在最新版本中出现的每条消息.
我的问题是,我应该在这个翻译应用程序中为数据库表使用什么字符集?看起来有些欧洲语言字符不能以UTF-8存储?
MySQL慢查询日志通常按顺序显示以下一些条目.
SET timestamp=1268999330;
commit;
# User@Host: username[username] @ localhost []
# Query_time: 4.172700 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
SET timestamp=1268999330;
commit;
# User@Host: username[username] @ localhost []
# Query_time: 3.628924 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
SET timestamp=1268999330;
commit;
# User@Host: username[username] @ localhost []
# Query_time: 3.116018 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
...
Run Code Online (Sandbox Code Playgroud)
通常按顺序进行6-7"提交"查询.任何人他们是什么,以及他们每个人的先前查询是什么?
提前致谢.
我目前正在为Django项目开发一个多语言界面.但是当我开始使用阿拉伯语和希伯来语时,我注意到dir ="rtl"到html标签后所有页面都搞砸了(根据http://www.w3.org/International/tutorials/bidi-xhtml/上的说明))
这是否意味着我需要从右到左语言的单独样式表?
我只需要创建一个透明背景的.png图像,在其上绘制一些黑色文本并使用它保存 img.save('target.png', option='optimize')
看起来PIL会自动以32位模式保存.png图像.我可以减少颜色深度而不会在保存之前使输出图像看起来更糟糕吗?由于它只包含黑色文本和透明背景,我认为减少颜色深度会大大减少文件大小.