如果你需要在 Python 中处理一个大的 JSON 文件,会很容易出现耗尽内存的情况。即使原始数据大小小于内存容量,Python 也会进一步增加内存使用量。这意味着程序会在与磁盘交互时处理缓慢,或在内存不足时崩溃。

一种常见的解决方案是流解析,也就是惰性解析、迭代解析或分块处理。让我们看看如何将此技术应用于 JSON 处理。

问题:Python中加载JSON内存效率低

我们使用这个大小为24MB的JSON文件来举例,它在加载时会对内存产生明显的影响。这个JSON对象是在GitHub中,用户对存储库执行操作时的事件列表:

[{"id":"2489651045","type":"CreateEvent","actor":
{"id":665991,"login":"petroav","gravatar_id":"","url":"https://api.github.com/users/petroav","avatar_url":"https://avatars.githubusercontent.com/u/665991?"},"repo":
{"id":28688495,"name":"petroav/6.828","url":"https://api.github.com/repos/petroav/6.828"},"payload":
{"ref":"master","ref_type":"branch","master_branch":"master","description":"Solution to homework and assignments from MIT's 6.828 (Operating Systems Engineering). Done in my spare time.","pusher_type":"user"},"public":true,"created_at":"2015-01-01T15:00:00Z"},
...
]

我们的目标是找出给定用户在与哪些存储库进行交互。下面是一个简单的 Python 程序:

import jsonwith open("large-file.json", "r") as f:data = json.load(f)user_to_repos = {}
for record in data:user = record["actor"]["login"]repo = record["repo"]["name"]if user not in user_to_repos:user_to_repos[user] = set()user_to_repos[user].add(repo)

输出结果是一个用户名映射到存储库名称的字典。我们使用 Fil 内存分析器运行它时,可以发现内存使用的峰值达到了124MB,还可以发现两个主要的内存分配来源:

  1. 读取文件

  2. 将生成的字节解码为 Unicode 字符串

但我们加载的原始文件是24MB。一旦我们将它加载到内存中并将其解码为文本 (Unicode)Python 字符串,它需要的空间远远超过 24MB。这是为什么?

扩展知识:Python字符串的内存表示

Python字符串在表示时会被更少使用内存的方法优化。每个字符串都有固定的开销,如果字符串可以表示为 ASCII,则每个字符只使用一个字节的内存。如果字符串使用更多扩展字符,则每个字符可能使用4个字节。我们可以使用 sys.getsizeof() 查看一个对象需要多少内存:

>>> import sys
>>> s = "a" * 1000
>>> len(s)
1000
>>> sys.getsizeof(s)
1049>>> s2 = "❄" + "a" * 999
>>> len(s2)
1000
>>> sys.getsizeof(s2)
2074>>> s3 = "												

Python 处理超大 JSON 文件,这个方法简单!相关推荐

  1. vue加载服务器json文件,Vue加载json文件的方法简单示例

    本文实例讲述了Vue加载json文件的方法.分享给大家供大家参考,具体如下: 一.在build/dev-server.js文件里 var app = express() 这句代码后面添加如下(旧版): ...

  2. Python 处理超大JSON文件,这个方法简单

    前言 如果你需要在 Python 中处理一个大的 JSON 文件,会很容易出现耗尽内存的情况.即使原始数据大小小于内存容量,Python 也 会进一步增加内存使用量.这意味着程序会在与磁盘交互时处理缓 ...

  3. python json.loads()中文问题-Python实现的json文件读取及中文乱码显示问题解决方法...

    本文实例讲述了Python实现的json文件读取及中文乱码显示问题解决方法.分享给大家供大家参考,具体如下: city.json文件的内容如下: { "cities": [ { & ...

  4. 解析超大JSON文件

    解析超大JSON文件 1.需求 最近项目中需要将一个一个大于50G的JSON文件导入到ES中,试过普通的按行读取文件和JSONReader流读取文件,由于json文件实在过于庞大,都不能解决问题. 2 ...

  5. Python将内容写入文件的方法总结。

    使用Python写入文件是我们coder的日常,本篇带你详细看一下python将内容写入文件的方法以及细节.主要包括write()方法.writelines() 方法.print() 函数.使用 cs ...

  6. android mp3 lrc歌词文件utf-8歌词显示为乱码,Android读取本地json文件的方法(解决显示乱码问题)...

    本文实例讲述了Android读取本地json文件的方法.分享给大家供大家参考,具体如下: 1.读取本地JSON ,但是显示汉字乱码 public static String readLocalJson ...

  7. php删除垃圾文件,Python删除windows垃圾文件的方法

    本文实例讲述了Python删除windows垃圾文件的方法.分享给大家供大家参考.具体如下: #coding:utf-8 import os #from glob import glob if os. ...

  8. php二维码存放json数据_PHP生成及获取JSON文件的方法

    本文实例讲述了PHP生成及获取JSON文件的方法.分享给大家供大家参考,具体如下: 首先定义一个数组,然后遍历数据表,把相应的数据放到数组中,最后通过json_encode()转化数组 json_en ...

  9. [转载] 【Python】向json文件中追加新的对象

    参考链接: python json 13: 解析json文件中的多个json对象 [Python]向json文件中追加新的对象 def get_json(path, write_path): file ...

最新文章

  1. 中国电力设备行业运行状况与产量趋势研究报告2022版
  2. 多个单例模式单例模式的应用
  3. 关于线程上下文切换,你知道多少?
  4. HTTP GET 和 POST 的区别
  5. 申请XenCenter许可证
  6. switchhost使用与注意事项
  7. VC编程中20种各种编程技巧和方法
  8. Linux虚拟机之间如何添加互信
  9. dell t320 raid linux,Dell T320服务器阵列卡驱动下载
  10. solidworks钣金学习分享
  11. 5. 统计学基础2:协方差、相关系数、协方差矩阵
  12. Spring-拦截器与过滤器
  13. Unity小技巧——Inspector中插入数组元素
  14. “微信沃卡”的示范效应:联通和腾讯开启新模式
  15. DaVinci:窗口
  16. java 生成瓦片_生成矢量瓦片 | SuperMap iDesktop Java
  17. 5款黑科技小程序,便利我们的生活,每一款都实用到无法自拔!
  18. 证书管理机构——CA
  19. [转]浅说DFT 工程师三大法宝的使用
  20. “聚力远谋,创赢未来”坤前全国巡展广州站圆满落幕

热门文章

  1. mapbox-gl生成deck.gl动态路径数据(视频)
  2. 什么是“热门”,短语是从哪里来的?
  3. 10个常见的前端手写功能
  4. 整理部分因软件版权发律师函的公司
  5. 忘记区块链技术,融入区块链思维
  6. pip时使用清华镜像
  7. DDNS 学习 (一)
  8. 基于springboot的高校羽毛球馆信息管理系统的设计与实现
  9. 全国车牌和省市对应关系表
  10. C#开发的OpenRA游戏的游戏界面内鼠标处理窗口