91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將流解析技術(shù)應(yīng)用于JSON處理

Linux愛(ài)好者 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:Python開(kāi)發(fā)者 ? 2022-06-24 12:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

問(wèn)題:Python中加載JSON內(nèi)存效率低

我們使用這個(gè)大小為24MB的JSON文件來(lái)舉例,它在加載時(shí)會(huì)對(duì)內(nèi)存產(chǎn)生明顯的影響。這個(gè)JSON對(duì)象是在GitHub中,用戶(hù)對(duì)存儲(chǔ)庫(kù)執(zhí)行操作時(shí)的事件列表:

[{"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"},
...
]

我們的目標(biāo)是找出給定用戶(hù)在與哪些存儲(chǔ)庫(kù)進(jìn)行交互。下面是一個(gè)簡(jiǎn)單的 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)

輸出結(jié)果是一個(gè)用戶(hù)名映射到存儲(chǔ)庫(kù)名稱(chēng)的字典。我們使用 Fil 內(nèi)存分析器運(yùn)行它時(shí),可以發(fā)現(xiàn)內(nèi)存使用的峰值達(dá)到了124MB,還可以發(fā)現(xiàn)兩個(gè)主要的內(nèi)存分配來(lái)源:

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

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

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

擴(kuò)展知識(shí):Python字符串的內(nèi)存表示

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

>>>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個(gè)字符串都是 1000 個(gè)字符長(zhǎng),但它們使用的內(nèi)存量取決于它們包含的字符。

在本例中我們的大JSON 文件里包含不適合ASCII編碼的字符,正是因?yàn)樗亲鳛橐粋€(gè)巨大的字符串加載的,所以整個(gè)巨大的字符串會(huì)使用效率較低的內(nèi)存表示。

流處理解決方案

很明顯,將整個(gè)JSON文件直接加載到內(nèi)存中是一種內(nèi)存浪費(fèi)。

對(duì)一個(gè)結(jié)構(gòu)為對(duì)象列表的 JSON 文件,理論上我們可以一次解析一個(gè)塊,而不是一次全部解析,以此來(lái)減少內(nèi)存的使用量。目前有許多 Python 庫(kù)支持這種 JSON 解析方式,下面我們使用 ijson 庫(kù)來(lái)舉例。

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標(biāo)準(zhǔn)庫(kù),數(shù)據(jù)一旦被加載文件就會(huì)被關(guān)閉。而使用ijson,文件必須保持打開(kāi)狀態(tài),因?yàn)楫?dāng)我們遍歷記錄時(shí),JSON 解析器正在按需讀取文件。有關(guān)更多詳細(xì)信息,請(qǐng)參閱 ijson 文檔。

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

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

其他解決方法

  • Pandas:Pandas 具有讀取 JSON 的能力,理論上它可以以更節(jié)省內(nèi)存的方式讀取。
  • SQLite:SQLite 數(shù)據(jù)庫(kù)可以解析 JSON,將 JSON 存儲(chǔ)在列中,以及查詢(xún) JSON數(shù)據(jù)。因此,可以將 JSON 加載到磁盤(pán)支持的數(shù)據(jù)庫(kù)文件中,并對(duì)它運(yùn)行查詢(xún)來(lái)提取相關(guān)的數(shù)據(jù)子集。

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

知識(shí)延伸

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

原文標(biāo)題:Python 處理超大 JSON 文件,這個(gè)方法簡(jiǎn)單!

文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    9

    文章

    3211

    瀏覽量

    76379
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90071
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    128

    瀏覽量

    7783

原文標(biāo)題:Python 處理超大 JSON 文件,這個(gè)方法簡(jiǎn)單!

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    JSON:簡(jiǎn)潔代碼高效搞定序列化與反序列化

    的數(shù)據(jù)交換格式,易于人類(lèi)閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成。JSON雖源自JavaScript編程語(yǔ)言的子集,但其獨(dú)立于語(yǔ)言,已廣泛用于不同編程環(huán)境與系統(tǒng)之中。在嵌入
    的頭像 發(fā)表于 02-25 19:04 ?101次閱讀
    <b class='flag-5'>JSON</b>:簡(jiǎn)潔代碼高效搞定序列化與反序列化

    極簡(jiǎn)代碼,搞定JSON序列化與反序列化

    LuatOS開(kāi)發(fā)中,使用以下兩個(gè)函數(shù)高效處理JSON數(shù)據(jù)。 1.1 ?兩個(gè)關(guān)鍵函數(shù) 1)json.encode(obj,t) 功能是Lua對(duì)象序列化為
    的頭像 發(fā)表于 02-23 21:46 ?341次閱讀
    極簡(jiǎn)代碼,搞定<b class='flag-5'>JSON</b>序列化與反序列化

    詳解DBC的Signal與JSON文本結(jié)合

    為了優(yōu)化CAN數(shù)據(jù)發(fā)送與接收的操作流程,更改以前手動(dòng)輸入狀態(tài)對(duì)應(yīng)數(shù)據(jù)的模式,采用下拉列表選擇內(nèi)容,但這需要用到超出DBC原有承載能力的信息。因此,JSON與其結(jié)合,采用JSON格式文本寫(xiě)入Signal的Comment屬性,
    的頭像 發(fā)表于 01-06 10:57 ?303次閱讀
    詳解DBC的Signal與<b class='flag-5'>JSON</b>文本結(jié)合

    遠(yuǎn)心鏡頭核心技術(shù)解析與應(yīng)用

    遠(yuǎn)心鏡頭(TelecentricLens)是一種專(zhuān)為精密光學(xué)成像設(shè)計(jì)的鏡頭系統(tǒng),其核心在于消除傳統(tǒng)鏡頭中常見(jiàn)的透視失真和放大倍率變化問(wèn)題。該技術(shù)廣泛應(yīng)用于工業(yè)檢測(cè)、計(jì)量測(cè)量和機(jī)器視覺(jué)等領(lǐng)域,通過(guò)確保
    的頭像 發(fā)表于 12-08 17:25 ?651次閱讀
    遠(yuǎn)心鏡頭核心<b class='flag-5'>技術(shù)</b><b class='flag-5'>解析</b>與應(yīng)用

    解析淘寶拍立淘按圖搜索API接口與JSON數(shù)據(jù)示例參考

    應(yīng)用。 獲取API權(quán)限和密鑰(App Key、App Secret)。 使用Python調(diào)用API的示例代碼。 3. JSON數(shù)據(jù)示例與解析 返回的JSON數(shù)據(jù)結(jié)構(gòu)解析。 如何提取關(guān)鍵
    的頭像 發(fā)表于 11-11 13:19 ?341次閱讀

    深度解析淘寶拍立淘按圖搜索API接口與JSON數(shù)據(jù)示例參考

    引言 淘寶拍立淘是淘寶推出的一項(xiàng)基于圖像識(shí)別的搜索功能,用戶(hù)可以通過(guò)上傳圖片來(lái)搜索相似商品。淘寶開(kāi)放平臺(tái)提供了拍立淘按圖搜索API接口,幫助開(kāi)發(fā)者實(shí)現(xiàn)圖像搜索功能。本文深度解析淘寶拍立淘按圖搜索
    的頭像 發(fā)表于 11-06 13:43 ?312次閱讀

    FAQ_MA35_Family eMMC如何將映像編程到其中一個(gè)分區(qū)中,并將其他分區(qū)用于其他目的?

    FAQ_MA35_Family eMMC如何將映像編程到其中一個(gè)分區(qū)中,并將其他分區(qū)用于其他目的?
    發(fā)表于 09-02 08:05

    如何將GCC項(xiàng)目導(dǎo)入NuEclipse?

    如何將GCC項(xiàng)目導(dǎo)入NuEclipse?
    發(fā)表于 09-01 07:04

    如何將數(shù)智化技術(shù)應(yīng)用于城市燃?xì)庠O(shè)備資產(chǎn)管理?

    數(shù)智化技術(shù)為城市燃?xì)庠O(shè)備資產(chǎn)管理注入新動(dòng)能,實(shí)現(xiàn)從被動(dòng)應(yīng)對(duì)到主動(dòng)防控的跨越。這不僅筑牢安全防線(xiàn),更提升運(yùn)營(yíng)效能,為燃?xì)庑袠I(yè)高質(zhì)量發(fā)展提供有力支撐,守護(hù)城市能源血脈的暢通與安全。
    的頭像 發(fā)表于 08-14 11:00 ?582次閱讀
    <b class='flag-5'>如何將</b>數(shù)智化<b class='flag-5'>技術(shù)</b><b class='flag-5'>應(yīng)用于</b>城市燃?xì)庠O(shè)備資產(chǎn)管理?

    什么是反時(shí)限過(guò)保護(hù)?深入解析反時(shí)限過(guò)保護(hù)的應(yīng)用場(chǎng)景與優(yōu)勢(shì)

    在電力系統(tǒng)中,過(guò)保護(hù)是保障設(shè)備安全運(yùn)行和電網(wǎng)穩(wěn)定性的重要環(huán)節(jié)。其中,反時(shí)限過(guò)保護(hù)以其獨(dú)特的動(dòng)作特性,在特定應(yīng)用場(chǎng)景下發(fā)揮著不可替代的作用。本文深入探討反時(shí)限過(guò)保護(hù)的原理、優(yōu)勢(shì),
    的頭像 發(fā)表于 07-17 13:53 ?3363次閱讀
    什么是反時(shí)限過(guò)<b class='flag-5'>流</b>保護(hù)?深入<b class='flag-5'>解析</b>反時(shí)限過(guò)<b class='flag-5'>流</b>保護(hù)的應(yīng)用場(chǎng)景與優(yōu)勢(shì)

    技術(shù)分享 | 迅為RK3568開(kāi)發(fā)板如何將 Linux 板卡虛擬成U盤(pán)

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

    如何將一個(gè)FA模型開(kāi)發(fā)的聲明式范式應(yīng)用切換到Stage模型

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

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

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

    反激的PSR與SSR控制技術(shù)解析及優(yōu)劣

    控制芯片處理后得到MOS管的驅(qū)動(dòng)信號(hào),其開(kāi)通時(shí)間決定了電感所儲(chǔ)存的能量,從而也影響副邊繞組輸出電壓,經(jīng)過(guò)這個(gè)反饋過(guò)程最終得到穩(wěn)定的輸出電壓。SSR技術(shù)是發(fā)展較早的反激電源控制技術(shù),通過(guò)對(duì)輸出電壓采樣實(shí)現(xiàn)
    發(fā)表于 03-27 13:51

    如何將Linux安裝包快速轉(zhuǎn)成玲瓏包

    本篇將以 motrix 為例為大家展示如何將 Linux 安裝包快速轉(zhuǎn)成玲瓏包。
    的頭像 發(fā)表于 03-12 16:01 ?1697次閱讀
    <b class='flag-5'>如何將</b>Linux安裝包快速轉(zhuǎn)成玲瓏包