3

我正在构建一个基于 python 的 Web 服务,它为我们的主应用程序 API 提供自然语言处理支持。由于它是如此繁重的 NLP,它需要从磁盘中提取一些非常大的 (50-300MB) 语料库文件,然后才能进行任何类型的分析。

如何将这些文件加载​​到内存中,以便它们可用于每个请求?我尝试了 memcached 和 redis,但它们似乎是为更小的对象设计的。我也一直在尝试使用 Flaskg对象,但这只会在一个请求中持续存在。

在使用 gevent (或其他)服务器允许并发连接时,有什么方法可以做到这一点?语料库是完全只读的,因此应该有一种安全的方式将内存暴露给多个greenlets/threads/processes。

非常感谢,如果这是一个愚蠢的问题,我很抱歉——我使用 python 已经有一段时间了,但我对网络编程还比较陌生。

4

2 回答 2

1

如果你使用 Gevent,你可以在你的进程的全局范围内拥有你的只读数据结构,它们将被所有的 greenlet 共享。使用 Gevent,您的服务器将包含在单个进程中,因此数据可以一次加载并在所有工作程序 greenlet 之间共享。

封装对数据的访问的一种好方法是将访问函数或类放入模块中。您可以在导入模块时取消选中数据,或者您可以在有人第一次调用模块中的函数时触发此任务。

您需要确保不可能引入竞争条件,但如果数据是严格只读的,您应该没问题。

于 2013-08-17T02:46:37.837 回答
0

你不能在服务器实例化时解开文件,然后将解开的数据保存到全局命名空间中吗?这样,每个请求都可以使用它,并且由于您不打算在其中编写任何内容,因此您不必担心任何竞争条件。

于 2013-08-17T07:10:52.620 回答