【问题标题】:Python open json file keep in memoryPython打开json文件保存在内存中
【发布时间】:2018-05-17 15:16:14
【问题描述】:

问题,我有一个访问 json 文件中数据的应用程序。现在,每次应用程序需要数据时,我都会像这样打开和关闭文件。

def access_file():
    try:
        with open(my_file, 'r') as json_data:
            json_data = json.load(json_data)
            return json_data
    except FileNotFoundError:
        logging.error("my_file not found.")

我认为连续多次打开和关闭此文件并不明智。如何只打开一次,如果它没有打开并保持打开,然后我可以在需要时访问它。

【问题讨论】:

  • 如果文件不是很大,您可以简单地将其保存在所需命名空间中可访问的对象中。并且有很多方法可以做这样的事情,这与你的代码的其余部分以及你如何在代码中使用这个函数密切相关。
  • 假设文件很大,而且会变得更大。有办法吗?
  • 假设您的 json 文件确实变得太大而无法将其保存在内存中,那么问题将首先出现在 json 模块内部尝试解析它,而不是您的代码试图将结果保存在变量中。所以只要json_data可以返回,一切都好。
  • 在这种情况下,您应该使用数据库。

标签: json python-3.x


【解决方案1】:

一种不需要太多开销的方法是使用standard lib's lru_cache。您可以用它装饰一个函数,它会记住该函数的结果(取决于参数,在这种情况下没有)。下次调用该函数时,结果会从内存中的缓存中返回,而不是重新执行该函数。

正如您在本示例中所见,只需对您的代码进行极少的添加即可。

import json
from functools import lru_cache

my_file = 'foo.json'

@lru_cache(maxsize=1)
def access_file():
    try:
        with open(my_file, 'r') as json_data:
            json_data = json.load(json_data)
            return json_data
    except FileNotFoundError:
        logging.error("my_file not found.")


print(access_file())

import os
os.remove(my_file)

print(access_file())

在这里我什至删除了文件以证明它确实有效,但我建议你不要这样做:) 如果您运行此代码,您将看到 JSON 文件的内容打印了两次。

【讨论】:

  • 谢谢塞缪尔!这看起来像我需要的,将对此进行测试。快速的问题,假设我的应用程序正在运行并且我进行了 json 更改,我是否必须重新启动应用程序才能清除缓存?还是我应该建立一种清除缓存的方法?
  • @WhitneyChia 如果在运行应用程序时 JSON 发生变化,您将使用旧版本,因此您必须小心。
  • @WhitneyChia 一些缓解这种情况的方法:1)保留文件内容的 md5(或其他哈希),并且仅在哈希未更改时才查看缓存,2)存储最后修改日期os.path.getmtime,如果最后修改时间与您存储的时间不匹配,则读取文件。
猜你喜欢
  • 2011-01-15
  • 2011-03-04
  • 2015-10-19
  • 2021-11-24
  • 2021-02-01
  • 2013-01-08
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多