将大量矩阵加载到 Python shell
Loading a big list of matrices into Python shell
我有一个文件,其中包含一个非常大的矩阵列表(即整数列表列表),我想将其加载到 python shell 中。文件内容的格式为
L = [ [[1,2],[3,4]], [[5,6],[7,8]], ... ]
所以我尝试通过 "execfile(filename)" 加载它。不幸的是,我 运行 以这种方式失去了记忆。我做错了什么?
对比:文件大小约2GB,而机器有100GB内存。矩阵的尺寸为 1000x1000。
我尝试使用 ast.literal_eval
。如果它不起作用,我会删除我的答案,但我认为值得一试:
import ast
with open("bigfile.txt") as f:
while True:
c = f.read(1)
if not c:
break
if c=='=':
# equals found, skip spaces if any
while f.read(1)==" ":
pass
break
# rewind to sync with non-whitespace char that we have consumed
f.seek(f.tell()-1)
L = ast.literal_eval(f.read())
基本上,打开文件,一个字符一个字符地读取以跳过赋值(literal_eval
不评估赋值,只评估结构,有点像json
)并喂养其余的巨大文件到文字评估器。
因为这是另一种方法,它可能会起作用,而且它比使用 exec
或 eval
.
更安全。
编辑:因为你的评论说它仍然占用大量内存,我建议你逐行写入数据,这样 ast.literal_eval 可以将每一行评估为一个向量,你可以把它放在你的矩阵.
我有一个文件,其中包含一个非常大的矩阵列表(即整数列表列表),我想将其加载到 python shell 中。文件内容的格式为
L = [ [[1,2],[3,4]], [[5,6],[7,8]], ... ]
所以我尝试通过 "execfile(filename)" 加载它。不幸的是,我 运行 以这种方式失去了记忆。我做错了什么?
对比:文件大小约2GB,而机器有100GB内存。矩阵的尺寸为 1000x1000。
我尝试使用 ast.literal_eval
。如果它不起作用,我会删除我的答案,但我认为值得一试:
import ast
with open("bigfile.txt") as f:
while True:
c = f.read(1)
if not c:
break
if c=='=':
# equals found, skip spaces if any
while f.read(1)==" ":
pass
break
# rewind to sync with non-whitespace char that we have consumed
f.seek(f.tell()-1)
L = ast.literal_eval(f.read())
基本上,打开文件,一个字符一个字符地读取以跳过赋值(literal_eval
不评估赋值,只评估结构,有点像json
)并喂养其余的巨大文件到文字评估器。
因为这是另一种方法,它可能会起作用,而且它比使用 exec
或 eval
.
编辑:因为你的评论说它仍然占用大量内存,我建议你逐行写入数据,这样 ast.literal_eval 可以将每一行评估为一个向量,你可以把它放在你的矩阵.