gpt4 book ai didi

python - 在 Python 中锁定免费只读列表?

转载 作者:太空狗 更新时间:2023-10-29 20:19:19 25 4
gpt4 key购买 nike

我已经完成了一些基本的性能和内存消耗基准测试,我想知道是否有任何方法可以使事情变得更快......

  1. 我有一个包含 70,000 个元素的巨大列表,其中包含一个 numpy ndarray,文件路径位于所述列表的一个元组中。

  2. 我的第一个版本将列表的切片副本传递给 python 多进程模块中的每个进程,但它会将 ram 使用量激增到超过 20 GB

  3. 第二个版本我将它移动到全局空间并通过索引访问它,例如 foo[i] 在我的每个进程中循环访问它,这似乎将它放入共享内存区域/CoW 语义中处理因此它不会爆炸内存使用量(保持在 ~3 GB)

  4. 但是根据性能基准测试/跟踪,似乎大部分应用程序时间现在都花在“获取”模式上...

所以我想知道是否有任何方法可以将此列表变成某种无锁/只读的列表,这样我就可以取消部分获取步骤,从而进一步加快访问速度。

编辑 1:这是应用分析的前几行输出

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
65 2450.903 37.706 2450.903 37.706 {built-in method acquire}
39320 0.481 0.000 0.481 0.000 {method 'read' of 'file' objects}
600 0.298 0.000 0.298 0.000 {posix.waitpid}
48 0.271 0.006 0.271 0.006 {posix.fork}

编辑 2:这是列表结构的示例:

# Sample code for a rough idea of how the list is constructed
sim = []
for root, dirs, files in os.walk(rootdir):
path = os.path.join(root, filename)
image= Image.open(path)
np_array = np.asarray(image)
sim.append( (np_array, path) )

# Roughly it would look something like say this below
sim = List( (np.array([[1, 2, 3], [4, 5, 6]], np.int32), "/foobar/com/what.something") )

从今以后,SIM 列表将是只读的。

最佳答案

multiprocessing 模块提供了您所需要的:一个带有可选锁定的共享数组,即 multiprocessing.Array类(class)。将 lock=False 传递给构造函数以禁用锁定。

编辑(考虑到您的更新):事情实际上比我最初预期的要复杂得多。列表中所有元素的数据都需要在共享内存中创建。是否将列表本身(即指向实际数据的指针)放在共享内存中并不重要,因为与所有文件的数据相比,这应该很小。要将文件数据存储在共享内存中,请使用

shared_data = multiprocessing.sharedctypes.RawArray("c", data)

其中 data 是您从文件中读取的数据。要在其中一个进程中将其用作 NumPy 数组,请使用

numpy.frombuffer(shared_data, dtype="c")

这将为共享数据创建一个 NumPy 数组 View 。同样,要将路径名放入共享内存,请使用

shared_path = multiprocessing.sharedctypes.RawArray("c", path)

其中 path 是一个普通的 Python 字符串。在您的流程中,您可以使用 shared_pa​​th.raw 将其作为 Python 字符串进行访问。现在将 (shared_data, shared_pa​​th) 添加到您的列表中。该列表将被复制到其他进程,但实际数据不会。

我最初打算对实际列表使用 multiprocessing.Array。这是完全可能的,并且会确保列表本身(即指向数据的指针)也在共享内存中。现在我认为这根本不是那么重要,只要共享实际数据即可。

关于python - 在 Python 中锁定免费只读列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4750141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com