You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python应用优化:如何仅加载一次JSON文件并驻留内存访问

如何将JSON文件仅加载一次到内存并重复访问

嘿,这个问题提得非常中肯!频繁打开关闭文件确实会带来不必要的IO开销,尤其是当你的JSON文件内容不会频繁变动时,把数据缓存到内存里绝对是更高效的做法。下面给你分享几种实用的实现方案,你可以根据自己的项目场景选择:

方案1:模块级初始化加载

Python模块在程序运行过程中只会被导入一次,所以我们可以把JSON加载逻辑放在模块的顶层,这样模块第一次被导入时就会完成数据加载,后续所有调用都直接使用内存中的数据:

import json
import logging

# 模块加载时一次性读取JSON文件到内存
_cached_json_data = None
try:
    with open("my_file.json", "r") as json_file:
        _cached_json_data = json.load(json_file)
except FileNotFoundError:
    logging.error("my_file not found.")
    _cached_json_data = {}  # 设置默认空字典,避免后续调用报错

def get_json_data():
    """返回内存中的JSON数据"""
    return _cached_json_data

使用的时候,你只需要在其他文件中导入这个模块,调用get_json_data()就能直接拿到内存里的数据,完全不需要再操作文件啦。

方案2:懒加载函数(按需加载)

如果你的应用可能在运行过程中不一定会用到这份JSON数据,那懒加载会更合适——只有当第一次调用获取数据的函数时,才会去读取文件并缓存:

import json
import logging

# 用一个私有变量存储缓存的数据
_cached_data = None

def get_json_data():
    global _cached_data
    # 如果缓存为空,才去读取文件
    if _cached_data is None:
        try:
            with open("my_file.json", "r") as json_file:
                _cached_data = json.load(json_file)
        except FileNotFoundError:
            logging.error("my_file not found.")
            _cached_data = {}
    return _cached_data

这种方式能避免程序启动时就加载不必要的资源,更节省内存。

方案3:单例类(面向对象场景)

如果你的项目是面向对象架构,用单例类来管理这份数据会更优雅,同时也方便后续扩展(比如添加刷新缓存的方法):

import json
import logging

class JSONDataManager:
    _instance = None
    _cached_data = None

    def __new__(cls):
        # 确保整个程序中只有一个类实例
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # 初始化时加载JSON数据
            try:
                with open("my_file.json", "r") as json_file:
                    cls._cached_data = json.load(json_file)
            except FileNotFoundError:
                logging.error("my_file not found.")
                cls._cached_data = {}
        return cls._instance

    def get_data(self):
        return self._cached_data

    def refresh_data(self):
        """可选:添加刷新缓存的方法,用于文件内容更新后重新加载"""
        try:
            with open("my_file.json", "r") as json_file:
                self._cached_data = json.load(json_file)
        except FileNotFoundError:
            logging.error("my_file not found.")
            self._cached_data = {}

使用示例:

data_manager = JSONDataManager()
my_data = data_manager.get_data()

# 如果文件内容更新了,调用刷新方法重新加载
data_manager.refresh_data()

额外注意点

  • 如果你的JSON文件在程序运行过程中会被修改,上面的方案默认不会自动同步最新内容。如果需要同步,可以像单例类那样添加一个refresh_data的方法,手动触发重新加载。
  • 确保你的JSON文件内容不会过大,否则一次性加载到内存可能会占用过多资源(不过一般业务场景下的配置类JSON都没问题)。

内容的提问来源于stack exchange,提问作者WhitneyChia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:16