在不同的Python运行之间使用相同的变量

问题描述 投票:0回答:1

我有一个这样的脚本

for epoch in range(num_epochs):
    for bag in range(num_bags):
        feats = pd.read_csv(f"feats_{bag}.csv")
        ... # some logic

如您所见,它重复从一组文件中读取数据。每个“feats_{bag}.csv”文件都会从磁盘重复读取

num_epoch
次。这减慢了程序的速度。我立即预加载了所有数据,这很有帮助。在以下脚本中,每个“feats_{bag}.csv”仅读取一次。

all_feats = [pd.read_csv(f"feats_{bag}.csv") for bag in range(num_bags)]
for epoch in range(num_epochs):
    for bag in range(num_bags):
        feats = all_feats[bag]

上述程序的问题是内存使用,因为它一次加载所有数据。

all_feats
变量大约占用 20GB 内存。我有大约 64 GB 的内存,所以我只能同时执行该程序 3 次。由于所有运行都使用同一组
feats
,我认为必须有一种方法可以加载数据(
all_feats
变量)一次,并在所有运行中同时使用它超过 3 次运行。

换句话说,只需为

all_feats
变量占用 20GB 的存储空间,我想通过在它们之间共享
all_feats
变量来运行许多脚本(所有脚本都使用
all_feats
变量)。

我查阅了

mmap
和 Python
multiprocessing.shared_memory
。尽管两者都允许在进程之间共享变量,但它们似乎不适合我的问题。例如,对于共享内存,我尝试了以下方法:

# SharedMemory Server
all_feats = [pd.read_csv(f"feats_{bag}.csv") for bag in range(num_bags)]
sl = shared_memory.ShareableList(all_feats, name='all_feats')
# SharedMemory Client
all_feats = shared_memory.ShareableList(name='MyList')
print(id(all_feats), all_feats)

但是,运行服务器后,当我多次运行客户端时,

all_feats
的id似乎每次运行都不一样,这意味着它们使用了不同的内存位置,因此占用的内存再次超出了我的预期。

我对加速还有其他一些想法:

  • 使用 Redis 或其他内存数据库将 all_feats 文件加载到内存中。然后再次使用第一种方法。即每次迭代时仅加载当前所需的功能,但这次是从 Redis 加载。
for epoch in range(num_epochs):
    for bag in range(num_bags):
        feats = redis.get("bag_i")
        ... # some logic

我希望从内存(redis)而不是磁盘中读取,可以提供合理的速度提升,尽管不如在 Python 中预加载所有数据。

  • 将专长分成小块,然后逐部分预加载。
for epoch in range(num_epochs):
    for chunk in range(num_chunks):
        chunk_feats = [pd.read_csv(f"feats_{bag}.csv") for bag in range(chunk, chunk+1)] # you get the idea
            for bag in range(num_bags_in_chunk):
                feats = chunk_feats[bag]
                ... # some logic

这又不理想,因为与完整的预加载方法相比,它提供了部分提升。现在最大内存使用量与

all_feats

每个块的大小一样多

总而言之,我正在寻找一种在相同/不同 Python 脚本的不同运行中使用“相同变量”的方法。请注意,我不想使用变量的重复项。因此,使用内存中的文件并读取该文件对我没有帮助。所有脚本仅读取变量而不更改它。

shared_memory

可以解决这个问题吗?那么为什么它在不同的运行中为

all_feats
变量分配不同的 ID?
    

python redis multiprocessing shared-memory mmap
1个回答
0
投票

for bag in range(num_bags): feats = pd.read_csv(f"feats_{bag}.csv") for epoch in range(num_epochs): ... # some logic

© www.soinside.com 2019 - 2024. All rights reserved.