Python 内存占用也太大了。

2018-09-25 10:12:15 +08:00
 skinny

我现有 5 个 collections.Counter 的 pickle 文件,单个文件在 84MB-240MB 之间,总共 664MB,总记录在 3 千多万,实际数据大小也就 400MB 左右。之所以分为 5 个文件是因为之前有几个 GB 的数据,我电脑内存小( 6GB ),又是机械硬盘,根本没办法一下子读取和处理,我分割成小块处理,最后变成了这 5 个文件,然后我想合并这些文件进行最后处理。

最终合并前,我预估过用 C 实现类似的字典( D[char[10],uint])合并,内存用的不会很多,即便是最粗糙的字典实现也只需要 680M 左右内存,我看 pickle 文件加起来才 664MB,就算翻 4 翻的内存占用机器也撑得住,可是一运行内存就被耗光,然后机器死机了,只能强制关机,根据死机前的 Python 占用情况,最终可能需要内存要 6GB-8GB 才能加载处理总共 664M 的这 5 个 pickle 文件。(只有 load 和 plus 操作)

可能有人会问我为什么不用 Redis 或者数据库查询,因为我没安装,我也就这一次需要以这种方式处理这种文件。前面用 Python 处理单个小文件时还好,虽然速度不敢恭维,不过还能接受,胜在写起来简单方便。

目前对 Python 感受就是慢、吃内存,但是写起来简单(当然也有非常复杂的,比如 asynio ),真的是胶水一样的语言。

22595 次点击
所在节点    Python
98 条回复
est
2018-09-25 11:41:00 +08:00
@skinny 因为会用的人就会给出自己的版本号和环境,pickle 的调用方式,和 profile 的具体卡在哪个调用上的剖析。

你除了抱怨没有给出任何有用的信息。当然结论就是你不会用了。
wutiantong
2018-09-25 12:07:23 +08:00
@skinny 人家 est 所 diss 的是“你不会用 pickle 非要强上才导致的问题不应该怪 python ”,你非要理解成他在袒护 pickle,你这边的沟通理解能力堪忧
billgreen1
2018-09-25 12:10:16 +08:00
@est 我觉得会问问题的人,一般会提供环境,版本号,自己的分析,以及疑问等;楼主最多是不太会问问题,你直接得出不会用,这个结论是难以成立的。
est
2018-09-25 12:18:51 +08:00
@billgreen1 万一我猜对了呢。
javaWeber
2018-09-25 12:22:35 +08:00
用 java,上 maven,加 20 个依赖包。。开始写程序。
GreenHand
2018-09-25 12:38:38 +08:00
试一下其他语言的对象序列化 /反序列化是否占用内存再来吐槽 Python ?

你这种情况不需要用到 pickle 吧?只是 string: integer 的映射而已,直接写到文件不行吗?

```
with open('data.txt', 'w') as f:
for i in xrange(30000000):
print >>f, '%s:%s' % (str(i), i)
```

最后一行的分隔符(冒号)替换一下保证 key 里面不包括换行符即可。
SuperMild
2018-09-25 12:42:28 +08:00
数据库没安装? Python 使用 sqlite 不用安装。
kernel
2018-09-25 13:27:59 +08:00
楼主要反击也容易,直接写个几行 python 小程序里加 100M 个 int 到一个 dict 里看看最终占多少内存
lance6716
2018-09-25 13:29:46 +08:00
Python 对象内存占用太多我还是第一次听说… dict 最近几个版本就是优化了占用
skinny
2018-09-25 13:41:08 +08:00
@billgreen1 我从头到尾没有问问题,只是就使用体验的吐槽而已。
@wutiantong 你这更加莫名其妙了,从头到尾没有 pickle 什么事情,我主贴里说了,吐槽的是本来不大的数据,载入转换成 Python 对象以后翻了很多翻,究竟是谁沟通能力、理解能力堪忧?
skinny
2018-09-25 13:42:32 +08:00
@kernel 他们不会去试的。
sagaxu
2018-09-25 13:44:27 +08:00
py 最小的数据类型,一个对象也是几十字节
kernel
2018-09-25 13:51:16 +08:00
@lance6716 在处理大量小数据时,比如在 C 里一个 int32 就是 4 字节,python 里要几十字节
当然处理大量小数据一般不是 python 的应用场景,反正我是从来没碰到过
zhzer
2018-09-25 13:53:13 +08:00
counter 还储存了频率本来就应该大一点啊
scriptB0y
2018-09-25 13:56:27 +08:00
还是看一下为什么会占这么多内存: https://pypi.python.org/pypi/memory_profiler
wutiantong
2018-09-25 14:03:56 +08:00
@skinny 不是,你老说没 pickle 什么事,可是你明明就是在用 pickle 做序列化反序列化啊?
hahastudio
2018-09-25 14:26:10 +08:00
因为高级语言会需要更多的内存空间去存储内部状态、存储函数指针,按你这么说,现在的高级语言怕不是都要被喷
6 GB 内存和机械硬盘才是主要矛盾,因为内存的限制,你只能用外排序的类似思想去做统计
-话说需要压缩内存空间的话,为什么不写 C/C++-
lance6716
2018-09-25 14:30:42 +08:00
nooper
2018-09-25 14:33:17 +08:00
hdf5, blosc. 10g 的能压缩成 1g 的内容。本人已测试。300m-> 20m-30m
skinny
2018-09-25 15:06:47 +08:00
@kernel 我也是第一次遇到。

@zhzer 是该大一些,我主贴里一开始是吐槽大得超过预期,只是一些人立了些莫名其妙的靶子来 diss 我。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492253

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX