我怎么能读一个巨大的json文件(0.5 gb)

22日视图(30天)
梅尔Preiszler
梅尔Preiszler 2019年4月25日
我有一个巨大的json文件。我试着使用“fileread”命令但我得到一个“内存不足”的信息。我的电脑上我有4 GB的RAM。谁能推荐一个解决方案吗?
谢谢,
梅尔

答案(2)

Guillaume
Guillaume 2019年4月28日
问题是,你的电脑根本没有足够的内存。什么 内存 说在你简单地开始matlab ?
你有试过 jsondecode 吗?尽管它的瑕疵(*)这当然更适合 fileread 但我怀疑它仍然会耗尽内存,因为你似乎没有足够的内存来保存整个文件在内存中,更不用说其解码内容。
*:我是mathworks解决几个问题与json解码时首先实现但剩余缺陷仍然是不可逆的损坏对象属性的名称不是有效的变量名或超过64个字符。
1评论
1月
1月 2019年4月29日
fileread 需要一个contigious块1 GB(两个字节每charatcer文件),解析JSON字符串分割数据几个舢板,哪些不需要存储作为一个连续的块。但也许JSON文件包含一个大矩阵的数值数据,存储和3个字符分隔符。然后用8个字节/解析创建一个矩阵元素(如果 使用),这就需要吗 RAM比 fileread
唯一可靠的进口大型JSON文件的方法是提供足够的RAM。因此:+ 1

登录置评。


1月
1月 2019年4月25日
编辑:1月 2019年4月25日
如果你使用 fileread 的0.5 GB字节转换为一个char向量,它占据了1 GB的内存,因为Matlab使用2字节/字符。你没有1 GB的空闲RAM contigous块。文件可以导入到一个细胞字符串,但这需要更多的RAM由于开销约100字节为每一行文本。但内存不需要免费的细胞在一个contigous块字符串。预先分配不是微不足道的,但是你可以用块如1000行:
函数C = readtextfile(文件名)
(fid,味精)= fopen(文件名,“r”);
如果fid = = 1
错误(味精);
结束
数控= 1000;
iC = 0;
C =细胞(nC);
~ feof (fid)
s = fgetl (fid);
如果ischar (s)
集成电路iC + = 1;
如果iC >数控
数控=数控+ 1000;
C{数控}= [];%扩大细胞
结束
C {iC} = s;
结束
结束
文件关闭(fid);
C = C (1: iC);%作物未使用细胞字符串
结束
这将需要一段时间。结果将需要超过1 GB RAM油田,但不是在一个连续的块。所以导入工作。但只要你想处理数据,你需要更多的内存。所以唯一可靠的解决方案是安装更多的内存,或者只导入数据的特定部分。
7评论
沃尔特·罗伯森
沃尔特·罗伯森 2019年4月29日
真实的。成功将取决于是否有大数据块或一些小变量——虽然也许在上下文将变成意义包小变量数组。
更多的RAM不会伤害……

登录置评。

s manbetx 845


释放

R2018b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!