Python 通过ast.literal\u eval加载41MB文件会导致MemoryError

Python 通过ast.literal\u eval加载41MB文件会导致MemoryError,python,Python,如何使用ast.literal\u eval解析一个大文件而不引起MemoryError?例如,我要解析的文件是41MB 我观察了这个过程,发现python占用的内存超过了3G。我使用的是32位系统,因此它取决于进程的最大内存 为什么ast.literal_eval只解析数据结构,占用了这么多内存?有没有办法减少内存使用 顺便说一下,代码是: import ast file = open(file_name, 'r') data = ast.literal_eval(file.read()) f

如何使用ast.literal\u eval解析一个大文件而不引起MemoryError?例如,我要解析的文件是41MB

我观察了这个过程,发现python占用的内存超过了3G。我使用的是32位系统,因此它取决于进程的最大内存

为什么ast.literal_eval只解析数据结构,占用了这么多内存?有没有办法减少内存使用

顺便说一下,代码是:

import ast
file = open(file_name, 'r')
data = ast.literal_eval(file.read())
file.close()
例外是

  File "/usr/local/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/local/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
MemoryError

谢谢

在我的项目中,我一直面临着同样的问题。我遇到了两种解决方案,我认为它们可能对未来的用户有所帮助

1) 根据数据结构的不同,您可能希望使用像Redis这样的数据库(基于良好的评论,我正在使用这个数据库,尽管还有其他数据库)。Redis有一个很好的python扩展:RedisPy。它很容易使用。在开始将数据存储到数据库之前,您可能需要查找将要使用的查询过程

这是redis server的安装指南:(也有很多博客供使用)

以下是如何使用Python中的redis:

2) 如果数据结构是dictionary,则可以使用

json.loads() 
这是容易和内存效率。即使数据结构不是一个字典,您也可以使它成为一个具有任意键的字典,一旦

d = json.loads() 
执行时,您可以通过调用

d['arbitrary_key']

就个人而言,我喜欢使用Redis,因为我不必浪费时间加载文件。我所需要做的就是启动服务器并查询数据库


不管发生了什么,正确的答案可能是不要使用
ast.literal\u eval
。文件是什么样子的?试试,json或cjson如果是json格式,你可以分块读取文件:读取此:@iamsudip:这会有什么不同?据我所知,
ast.literal\u eval()
需要一次完成整个数据结构。@DSM它是元组、dict、字符串和整数的混合体,一团糟。我在运行时使用数据结构。但当进程关闭时,它就会丢失。因此,我想以一种易于加载的方式将数据结构转储到磁盘。由于python提供了ast.literal_eval,我认为这是一个不错的选择。谢谢!我使用json,因为有太多的数据无法使用任何基于IPC的方法:加载需要太多时间。