作者Kuster (克斯特)
看板Python
标题Re: [问题] 请问为何我这程式会吃掉过多记忆体?
时间Sun Feb 8 19:33:07 2009
我的档案格式是一行一行,每行有若干个数字
我要将每个数字都读近来
说的再清楚一点,这是一个存graph的文字档,每个数字代表各node
每行的第一个数字代表起始点,後面跟若干个数字代表这个node有连线到後面那些node
我想要自己设计资料结构来储存这些资料
以一个一维阵列代表index
再用一个一维阵列存data
这样若我要取编号为30的那个node有连线到那些node,我就只要下指令:
data[index[30-1]:index[30]]
这样切出来的东西就会是我要的了~
这样应该速度快且省记忆体(应该啦)
问题是....
我的系统是ubuntu 64bit
一个int就占了8byte?
我尝试使用NumPy指定我的array内整数为Int32,可是依旧肥大
直接使用:
data = range()
使用list格式,会占用2.4G ram
若用NumPy指定整数为Int32:
data = array( range() , Int32 )
这样记忆体会先标到2.4G,然後下降到1.9G
整体来说依旧相当肥
直接算的话,我有80M左右的资料量,资料内容是Int32,照理说就:
80M * 4byte = 320MB
我只要这麽多的记忆体空间就够了
造成记忆体占用如此大的原因应该就是数字也是物件的关系吧?猜的
请问若我要塞这麽大量的整数进去记忆体,使用python的话该用什麽方法呢?
我之前是学Java的,现在想说跳Python看看.....
感谢各位前辈!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.103.210
1F:推 ykjiang:graph 的话,我建议去抓 NetworkX ,可以存成 yaml 格式 02/08 21:10
2F:→ ykjiang:如果要跟旧格式相容,才需要自己写 parser 02/08 21:11
3F:推 ykjiang:对了,你资料的 nodes 数及平均 degree 是多少? 02/08 21:13
4F:→ ykjiang:如果网路规模太大,可考虑采用Boost Graph Library , 02/08 21:16
5F:→ ykjiang:它是 C++ 的库,且有 Python bindings 02/08 21:16
6F:→ yungyuc:Kruster 用的 graph 格式刚好是 metis 用的 02/08 21:37
7F:→ yungyuc:s/Kruster/Kuster 02/08 21:38
8F:推 ykjiang:其实这个格式叫做 adjacency list ,是很标准的作法, 02/08 21:54
10F:→ ykjiang:当初我因为每个 node 都有属性,所以无法直接用这个格式 02/08 21:57
11F:推 ykjiang:NetworkX 对 Graph 的支援很完整,可省很多工夫 02/08 21:59
12F:推 ykjiang:你loop过程记忆体需求飙高,很可能是遇到 degree 大的节点 02/08 22:11
13F:推 ykjiang:既简单没有吃记忆体的问题 02/08 22:14
14F:→ ykjiang:以你文中提到的应用,直接开档读指定 node 的那行不就得了 02/09 13:20