在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何將流解析技術應用于JSON處理

Linux愛好者 ? 來源:CSDN技術社區(qū) ? 作者:Python開發(fā)者 ? 2022-06-24 12:07 ? 次閱讀

如果你需要在 Python 中處理一個大的 JSON 文件,會很容易出現耗盡內存的情況。即使原始數據大小小于內存容量,Python 也會進一步增加內存使用量。這意味著程序會在與磁盤交互時處理緩慢,或在內存不足時崩潰。

一種常見的解決方案是流解析,也就是惰性解析、迭代解析或分塊處理。讓我們看看如何將此技術應用于 JSON 處理。

問題:Python中加載JSON內存效率低

我們使用這個大小為24MB的JSON文件來舉例,它在加載時會對內存產生明顯的影響。這個JSON對象是在GitHub中,用戶對存儲庫執(zhí)行操作時的事件列表:

[{"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":"SolutiontohomeworkandassignmentsfromMIT's6.828(OperatingSystemsEngineering).Doneinmysparetime.","pusher_type":"user"},"public":true,"created_at":"2015-01-01T1500Z"},
...
]

我們的目標是找出給定用戶在與哪些存儲庫進行交互。下面是一個簡單的 Python 程序:

importjson

withopen("large-file.json","r")asf:
data=json.load(f)

user_to_repos={}
forrecordindata:
user=record["actor"]["login"]
repo=record["repo"]["name"]
ifusernotinuser_to_repos:
user_to_repos[user]=set()
user_to_repos[user].add(repo)

輸出結果是一個用戶名映射到存儲庫名稱的字典。我們使用 Fil 內存分析器運行它時,可以發(fā)現內存使用的峰值達到了124MB,還可以發(fā)現兩個主要的內存分配來源:

  1. 讀取文件
  2. 將生成的字節(jié)解碼為 Unicode 字符串

9e32edfc-f371-11ec-ba43-dac502259ad0.png

但我們加載的原始文件是24MB。一旦我們將它加載到內存中并將其解碼為文本 (Unicode)Python 字符串,它需要的空間遠遠超過 24MB。這是為什么?

擴展知識:Python字符串的內存表示

Python字符串在表示時會被更少使用內存的方法優(yōu)化。每個字符串都有固定的開銷,如果字符串可以表示為 ASCII,則每個字符只使用一個字節(jié)的內存。如果字符串使用更多擴展字符,則每個字符可能使用4個字節(jié)。我們可以使用 sys.getsizeof() 查看一個對象需要多少內存:

>>>importsys
>>>s="a"*1000
>>>len(s)
1000
>>>sys.getsizeof(s)
1049

>>>s2=""+"a"*999
>>>len(s2)
1000
>>>sys.getsizeof(s2)
2074

>>>s3=""+"a"*999
>>>len(s3)
1000
>>>sys.getsizeof(s3)
4076

在上面的例子中3個字符串都是 1000 個字符長,但它們使用的內存量取決于它們包含的字符。

在本例中我們的大JSON 文件里包含不適合ASCII編碼的字符,正是因為它是作為一個巨大的字符串加載的,所以整個巨大的字符串會使用效率較低的內存表示。

流處理解決方案

很明顯,將整個JSON文件直接加載到內存中是一種內存浪費。

對一個結構為對象列表的 JSON 文件,理論上我們可以一次解析一個塊,而不是一次全部解析,以此來減少內存的使用量。目前有許多 Python 庫支持這種 JSON 解析方式,下面我們使用 ijson 庫來舉例。

importijson

user_to_repos={}

withopen("large-file.json","r")asf:
forrecordinijson.items(f,"item"):
user=record["actor"]["login"]
repo=record["repo"]["name"]
ifusernotinuser_to_repos:
user_to_repos[user]=set()
user_to_repos[user].add(repo)

如果使用json標準庫,數據一旦被加載文件就會被關閉。而使用ijson,文件必須保持打開狀態(tài),因為當我們遍歷記錄時,JSON 解析器正在按需讀取文件。有關更多詳細信息,請參閱 ijson 文檔。

在內存分析器運行它時,可以發(fā)現內存使用的峰值降到了3.6MB,問題解決了!而且在此例子中,使用 ijson 的流式處理也會提升運行時的性能,當然這個性能取決于數據集或算法。

9e41e712-f371-11ec-ba43-dac502259ad0.png

其他解決方法

  • Pandas:Pandas 具有讀取 JSON 的能力,理論上它可以以更節(jié)省內存的方式讀取。
  • SQLite:SQLite 數據庫可以解析 JSON,將 JSON 存儲在列中,以及查詢 JSON數據。因此,可以將 JSON 加載到磁盤支持的數據庫文件中,并對它運行查詢來提取相關的數據子集。

最后,如果可以控制輸出格式,則可以通過切換到更高效的表示來減少 JSON 處理的內存使用量。例如,從單個巨大的 JSON 對象列表切換到每行一條 JSON 記錄,這意味著每條解碼的 JSON 記錄將只使用少量內存。

知識延伸

前段時間,Python開發(fā)者公號推薦了一款很?實用的 JSON 工具?,可以更輕松直觀地查看 JSON。

原文標題:Python 處理超大 JSON 文件,這個方法簡單!

文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3115

    瀏覽量

    75053
  • python
    +關注

    關注

    56

    文章

    4825

    瀏覽量

    86343
  • JSON
    +關注

    關注

    0

    文章

    122

    瀏覽量

    7293

原文標題:Python 處理超大 JSON 文件,這個方法簡單!

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    技術分享 | 迅為RK3568開發(fā)板如何將 Linux 板卡虛擬成U盤

    技術分享 | 迅為RK3568開發(fā)板如何將 Linux 板卡虛擬成U盤
    的頭像 發(fā)表于 06-04 10:57 ?299次閱讀
    <b class='flag-5'>技術</b>分享 | 迅為RK3568開發(fā)板<b class='flag-5'>如何將</b> Linux 板卡虛擬成U盤

    如何將一個FA模型開發(fā)的聲明式范式應用切換到Stage模型

    模型切換概述 本文介紹如何將一個FA模型開發(fā)的聲明式范式應用切換到Stage模型,您需要完成如下動作: 工程切換:新建一個Stage模型的應用工程。 配置文件切換:config.json切換
    發(fā)表于 06-04 06:22

    不用聯(lián)網不用編程,PLC通過智能網關快速實現HTTP協(xié)議JSON格式與MES等系統(tǒng)平臺雙向數據通訊

    進行解析數據寫入到PLC,實現PLC與HTTP服務端雙向通訊;作為服務端時根據客戶端URL中的路徑查找所配置的數據,打包成JSON文件后返回給客戶端。
    的頭像 發(fā)表于 05-13 14:40 ?220次閱讀
    不用聯(lián)網不用編程,PLC通過智能網關快速實現HTTP協(xié)議<b class='flag-5'>JSON</b>格式與MES等系統(tǒng)平臺雙向數據通訊

    如何將項目從IAR遷移到Embedded Studio

    本文描述如何將IAR EWARM項目遷移到SEGGER Embedded Studio(簡稱SES)中。
    的頭像 發(fā)表于 02-25 17:11 ?502次閱讀
    <b class='flag-5'>如何將</b>項目從IAR遷移到Embedded Studio

    k230如何將yolo分類視頻推理后的視頻結果保存到本地?

    請問k230如何將yolo分類視頻推理后的視頻結果保存到本地?
    發(fā)表于 02-08 08:09

    如何將ADS1278通過SPI與處理器連接?

    在設計電路時,由于采用ADS1278進行8通道同步采樣,通過SPI接口與ARM微處理器的SPI接口進行連接,而ADS1278工作在Discrete模式下,請問專家如何將ADS1278通過SPI與處理器連接?此時DOUT1-8如
    發(fā)表于 02-07 07:31

    AN3408-如何將12位ADC用于力敏電阻

    電子發(fā)燒友網站提供《AN3408-如何將12位ADC用于力敏電阻.pdf》資料免費下載
    發(fā)表于 01-21 14:38 ?0次下載
    AN3408-<b class='flag-5'>如何將</b>12位ADC<b class='flag-5'>用于</b>力敏電阻

    實例篇 4G模組軟件之json數據處理!

    今天我會把4G模組軟件的json數據處理整理成文,以低功耗模組Air780E為例,一一展示出來:
    的頭像 發(fā)表于 11-12 12:17 ?463次閱讀

    控陣列芯片和普通芯片的區(qū)別

    控陣列芯片與普通芯片在設計與應用上存在顯著差異 設計原理:微控陣列芯片以微米級通道操控流體,集成多種實驗功能;普通芯片則通常基于晶體管,用于電子信號處理。 應用領域:微
    的頭像 發(fā)表于 10-30 15:10 ?631次閱讀

    TI TSC應用于各種和多種功能

    電子發(fā)燒友網站提供《TI TSC應用于各種和多種功能.pdf》資料免費下載
    發(fā)表于 10-22 10:15 ?0次下載
    <b class='flag-5'>將</b>TI TSC<b class='flag-5'>應用于</b>各種和多種功能

    JSON協(xié)議是什么,物聯(lián)網中的RTU中如何使用JSON協(xié)議和服務器交互

    一 概述 1.1 什么是 JSON JSON是JavaScript Object Notation的簡稱,中文含義為“JavaScript 對象表示法”,它是一種數據交換的文本格式,而不是一種編程
    的頭像 發(fā)表于 09-25 16:14 ?2040次閱讀
    <b class='flag-5'>JSON</b>協(xié)議是什么,物聯(lián)網中的RTU中如何使用<b class='flag-5'>JSON</b>協(xié)議和服務器交互

    如何將 THVD8000 應用于星型網絡系統(tǒng)

    電子發(fā)燒友網站提供《如何將 THVD8000 應用于星型網絡系統(tǒng).pdf》資料免費下載
    發(fā)表于 09-12 10:36 ?0次下載
    <b class='flag-5'>如何將</b> THVD8000 <b class='flag-5'>應用于</b>星型網絡系統(tǒng)

    如何將TRIZ應用于PCB設計的優(yōu)化階段?

    隨著技術的不斷進步和市場競爭的日益激烈,如何高效、創(chuàng)新地優(yōu)化PCB設計,以降低成本、提升性能、縮短上市周期,成為了工程師們共同面臨的挑戰(zhàn)。TRIZ(Theory of Inventive
    的頭像 發(fā)表于 09-04 16:40 ?637次閱讀

    如何將精益思維應用于傳統(tǒng)工廠的數字化轉型?

    隨著科技的不斷進步和市場競爭的日益激烈,傳統(tǒng)工廠正面臨著前所未有的挑戰(zhàn)。如何在這場數字化浪潮中站穩(wěn)腳跟,甚至實現彎道超車?答案或許就在精益思維中。今天,深圳天行健企業(yè)管理咨詢公司就來解析如何將精益
    的頭像 發(fā)表于 07-18 09:43 ?448次閱讀

    ZWS云平臺應用(5)-raw數據解析

    設備透傳上報的原始raw數據,如何解析成更易讀JSON數據格式?傳感器數據輸出是二進制,這種方式的數據量小,傳輸速度快。但二進制數據不夠直觀,需要將數據解析成更易讀的JSON數據格式。
    的頭像 發(fā)表于 06-19 08:25 ?556次閱讀
    ZWS云平臺應用(5)-raw數據<b class='flag-5'>解析</b>
    主站蜘蛛池模板: 岬奈奈美在线 国产一区 | 视频色版 | 成人看片免费无限观看视频 | 香蕉久久久久久狠狠色 | 福利片在线播放 | 日本视频h | 97精品久久天干天天蜜 | 欧美色图亚洲激情 | 51vv福利视频在线精品 | 色偷偷91综合久久噜噜噜男男 | 天天尻逼| 最新激情网站 | 亚洲 [12p]| 日本拍拍 | 亚洲一区二区三区免费看 | 欧美性猛交xxxx | 91大神精品视频 | 成年香蕉大黄美女美女 | 怡红院色视频在线 | 亚洲精品美女视频 | sis色中色| 欧美色国 | 午夜视频在线免费播放 | 俺要色 | 亚洲电影av | 天天爱天天做天天爽夜夜揉 | 欧美成人午夜片一一在线观看 | 黄视频在线观看网站 | 天天看片国产 | 色婷婷亚洲综合五月 | 亚洲综合色网 | www视频在线观看com | 国产伦精品一区二区三区免 | 美女免费视频是黄的 | 看全色黄大色大片免费久久 | sese国产| 亚州一级毛片在线 | 婷婷色激情 | 中文字幕xxx | 久久成人福利视频 | 4438成人成人高清视频 |