我目前有一个大文件(~65mb),里面有一个像这样的列表;
[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]]...]
Python认为上面是一个字符串,我试过eval()
和ast.literal_eval()
这两个都会导致内存错误。
然后我把它变成了一个字典{mlst: list()}
,它可以更快地加载它,但python仍然把它看作一个字符串。
有没有一种简单的方法让python识别字符串是一个列表?或者是为python构建JSON文件还是更容易阅读的格式?
谢谢!
答案 0 :(得分:3)
如果我创建一个文件:
x=[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]]]
即附加了简单赋值的字符串。
In [1]: import stack48648178
In [3]: stack48648178.x
Out[3]:
[[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
[[0, 0, 1], [0, 0, 2], [0, 0, 3]]]
实际上,这会对文件文本执行eval
。
我不打算生成并测试大文件。但是如果你得到一个内存错误,那么结果列表可能对你的RAM来说太大了。使用这种嵌套程度,列表结构(包含所有指针)可能会变得非常大。这个小的数字有唯一的ID,但你有几层指针可以到达每一个。
可能有一些中间列表涉及解析字符串以提高内存需求,但这很难追踪。
numpy数组的内存要求会更少,但你仍然需要通过列表解析来创建它:
In [5]: X = np.array(stack48648178.x)
In [6]: X.shape
Out[6]: (3, 3, 3)
In [7]: np.size(X)
Out[7]: 27
使用字符串memory:
In [8]: txt='[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,
...: 2],[0,0,3]]]'
In [9]: txt
Out[9]: '[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]]]'
In [10]: eval(txt)
Out[10]:
[[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
[[0, 0, 1], [0, 0, 2], [0, 0, 3]]]
In [11]: import json
In [12]: json.loads(txt)
Out[12]:
[[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
[[0, 0, 1], [0, 0, 2], [0, 0, 3]]]
eval
和json
执行相同的操作,从而生成相同的嵌套列表。我再说不出他们在处理过程中使用了多少内存,但我怀疑它的内存大致相同。