在Python中跨模块加载大型数据文件

r1zhe5dt  于 2023-04-08  发布在  Python
关注(0)|答案(2)|浏览(172)

我有多个python脚本,它们加载相同的csv/pickle文件,这些文件的大小非常大。所以我想只加载一次,并在多个脚本中使用它们。如果我在每个脚本中都加载它们,那么我就会耗尽内存。如果我只加载一次,并在多个脚本中使用,那就可以解决我的问题。
注意-1。我不修改我的脚本中的数据文件。只是只读使用在我所有的脚本。
注-2。我不想把这些脚本合并成一个,因为它们各自的作者很容易维护
我尝试使用一个像www.example.com这样的文件config.py,它是这样的:

import pandas as pd

global large_file
large_file= pd.read_csv('large_file.csv')

然后将其导入脚本中,如下所示:
Script1.py:

from config import large_file
print(large_file.shape)

Script2.py:

from config import large_file
print(large_file.shape)

这两个脚本都加载文件,这需要花费大量时间并使用双倍内存。

56lgkhnf

56lgkhnf1#

一种方法是创建一个单独的python模块来加载csv/pickle文件并将其存储在内存中,然后在所有需要使用数据的脚本中导入该模块。

rfbsl7qr

rfbsl7qr2#

如果你是一个接一个地运行你的脚本,你可以启动一个单独的python解释器,并使用python的runpy模块一个接一个地给它提供脚本。

import runpy
_ = runpy.run_module("Script1", run_name="__main__", alter_sys=True)
_ = runpy.run_module("Script2", run_name="__main__", alter_sys=True)

由于仅调用单个解释器,所以模块仍在存储器中并且不需要重新加载。
这个功能在大多数IDE中都可用,比如pycharm的run file in python console按钮或spyder run file按钮,或者VsCode中的类似按钮,但它们需要一些设置修改。
你可以用threading模块同时运行这两个脚本,但是由于全局解释器锁,结果会非常慢。
对于需要从多个进程并发访问数据的大规模问题,您可以将数据存储在像sqliteredis或python multiprocessing.Manager这样的数据库中,并且仅在运行时从其中读取您使用的数据,而不是阅读整个数据库。

相关问题