Python 类 的共享内存
Shared Memory for Python Classes
因此,当我在 Python 中学习 classes 时,我被告知 class 级别属性在给定 class 的所有实例之间共享。我认为我以前从未见过任何其他语言。
因此,我可以有多个实例,比如 DB class 提取数据 DB 数据并将其转储到 class 级别属性中。然后任何需要任何数据的实例都可以访问它,而不必去缓存或保存文件
明白了。
目前我正在调试一个分析 class,该分析通过一种低效的方式获取数据库数据 - 我目前正试图使这种方式更快。现在加载数据库数据需要几分钟时间。我为带有 ndarrays 的数据选择的格式不想通过 numpy.save 保存到文件(我现在不记得错误)。每次我稍微调整一下,数据就会丢失,我必须等待几分钟才能重新加载。
所以我想到我可以创建一个简单的 class 来保存该数据。 class 我不需要在单独的 iPython 控制台下更改 运行(我使用的是 Anaconda、Python 2.7 和 Spyder)。这样我就可以 link 分析 class 到分析 class 初始化中的共享数据 class。像这样:
def __init__(self):
self.__shared_data = SharedData()
self.__analytics_data_1 = self.__shared_data['analytics_data_1']
我的想法是,然后我会在分析 class 方法中写入 self.__analytics_data_1
。它将自动更新到分片数据 class。在调试期间,我会打开一个 iPython 控制台,除了保存共享数据 class 的实例外什么都不做。这样,当我必须重新加载并重新实例化分析 class 时,它只会获取我已经捕获的任何数据。显然,如果数据本身存在问题,则需要手动将其删除。
显然,我不想为我构建的每个工具使用相同的共享数据 class。但这很容易解决。我提到所有这些的原因是我无法在网上找到类似这样的食谱。那里似乎有很多食谱,所以我认为缺少食谱可能表明这是一个坏主意。
我曾尝试在 PHP 项目中通过 Memcache 实现类似的功能。然而,在那个项目中,我有很多读写操作,代码似乎导致了某种形式的写冲突。所以数据没有得到更新。 (而且 Memcache 甚至不能保证数据会在那里。)防止这种写冲突意味着大量额外的代码、额外的处理时间,最终代码变得太慢而无法使用。我想我可能会再次尝试使用 Python 中的共享内存以及使用共享内存进行调试。
想法?警告?
如果您想在 class 个实例之间共享数据,您应该这样做:
class SharedDataClass(object):
shared_data = SharedData()
除非您在构造函数中覆盖,否则这些 SharedData 实例将在您的 class 实例之间共享。
小心,GIL锁可能会影响性能!
共享数据"between consoles"或流程是另一回事。它们是独立的进程,当然,class 属性不共享。在这种情况下,您需要 IPC(它可以是文件系统、数据库、具有要连接的打开套接字的进程等)
因此,当我在 Python 中学习 classes 时,我被告知 class 级别属性在给定 class 的所有实例之间共享。我认为我以前从未见过任何其他语言。
因此,我可以有多个实例,比如 DB class 提取数据 DB 数据并将其转储到 class 级别属性中。然后任何需要任何数据的实例都可以访问它,而不必去缓存或保存文件 明白了。
目前我正在调试一个分析 class,该分析通过一种低效的方式获取数据库数据 - 我目前正试图使这种方式更快。现在加载数据库数据需要几分钟时间。我为带有 ndarrays 的数据选择的格式不想通过 numpy.save 保存到文件(我现在不记得错误)。每次我稍微调整一下,数据就会丢失,我必须等待几分钟才能重新加载。
所以我想到我可以创建一个简单的 class 来保存该数据。 class 我不需要在单独的 iPython 控制台下更改 运行(我使用的是 Anaconda、Python 2.7 和 Spyder)。这样我就可以 link 分析 class 到分析 class 初始化中的共享数据 class。像这样:
def __init__(self):
self.__shared_data = SharedData()
self.__analytics_data_1 = self.__shared_data['analytics_data_1']
我的想法是,然后我会在分析 class 方法中写入 self.__analytics_data_1
。它将自动更新到分片数据 class。在调试期间,我会打开一个 iPython 控制台,除了保存共享数据 class 的实例外什么都不做。这样,当我必须重新加载并重新实例化分析 class 时,它只会获取我已经捕获的任何数据。显然,如果数据本身存在问题,则需要手动将其删除。
显然,我不想为我构建的每个工具使用相同的共享数据 class。但这很容易解决。我提到所有这些的原因是我无法在网上找到类似这样的食谱。那里似乎有很多食谱,所以我认为缺少食谱可能表明这是一个坏主意。
我曾尝试在 PHP 项目中通过 Memcache 实现类似的功能。然而,在那个项目中,我有很多读写操作,代码似乎导致了某种形式的写冲突。所以数据没有得到更新。 (而且 Memcache 甚至不能保证数据会在那里。)防止这种写冲突意味着大量额外的代码、额外的处理时间,最终代码变得太慢而无法使用。我想我可能会再次尝试使用 Python 中的共享内存以及使用共享内存进行调试。
想法?警告?
如果您想在 class 个实例之间共享数据,您应该这样做:
class SharedDataClass(object):
shared_data = SharedData()
除非您在构造函数中覆盖,否则这些 SharedData 实例将在您的 class 实例之间共享。 小心,GIL锁可能会影响性能!
共享数据"between consoles"或流程是另一回事。它们是独立的进程,当然,class 属性不共享。在这种情况下,您需要 IPC(它可以是文件系统、数据库、具有要连接的打开套接字的进程等)