python - 用于映射大数据的Python共享内存字典

标签 python dictionary bigdata python-multiprocessing

我一直很难用一个大字典(约86GB,17.5亿个键)用Python中的多处理来处理一个大数据集(2TB)。
上下文:将字符串映射到字符串的字典从pickled文件加载到内存中。加载后,将创建工作进程(理想情况下>32),该进程必须在字典中查找值,但不能修改其内容,以便处理~2tb数据集。数据集需要并行处理,否则任务将花费一个多月的时间。
下面是我尝试过的两种三四五六七八九种方法(都失败了):
将字典作为全局变量存储在python程序中,然后分叉~32个工作进程。从理论上讲,这种方法可能有效,因为字典没有被修改,因此Linux上的cow机制意味着数据结构将在进程之间共享而不是复制。但是,当我尝试此操作时,我的程序在fork中的os.fork()上崩溃。我相信这是因为内核被配置为从不超量使用内存(multiprocessing.Pool.map被设置为OSError: [Errno 12] Cannot allocate memory,而且我不能在计算机上配置此设置,因为我没有根访问权限)。
使用/proc/sys/vm/overcommit_memory将字典加载到共享内存字典中。使用这种方法,我能够在不崩溃的情况下分叉32个工作进程,但是随后的数据处理比不需要字典的任务的另一个版本慢了几个数量级(唯一的区别是没有字典查找)。我的理论是,这是因为包含字典的管理器进程和每个工作进程之间的进程间通信,这是每个字典查找所必需的。虽然字典没有被修改,但是它被多次访问,通常是由许多进程同时访问的。
将字典复制到C++ +cc>中,并依赖Linux的牛机制来防止它被复制(类似于方法1,除了C++中的字典)。使用这种方法,需要很长时间才能将字典加载到2中,然后像以前一样从multiprocessing.Manager.dict上崩溃。
将字典复制到std::map中。将字典复制到std::map中花费的时间太长。
尝试使用ENOMEM的哈希表。C++中的底层实现允许它在共享内存中使用和使用。不幸的是,python API不提供此功能。
使用Pypy。车祸仍然发生在1。
os.fork()之上的python中实现我自己的共享内存哈希表。这种方法仍然会导致以1为焦点的内存不足错误。
将字典转储到pyshmht中。在尝试将字典转储到一个pyshmht数据库中4天后,看到预期的“33天”后,我放弃了这种方法。
将字典转储到redis。当我尝试使用SNAP将字典(86GB dict是从1024个较小的dict加载到redis中的)转储到redis时,会得到一个由对等错误重置的连接。当我尝试使用循环来转储键值对时,这需要非常长的时间。
如何在不需要进程间通信的情况下高效地并行处理此数据集,以便在此字典中查找值。我欢迎任何解决这个问题的建议!
我使用的是来自Ubuntu Anaconda的python 3.6.3,它的内存为1TB。
编辑:最终效果:
我可以用Redis让它工作。为了绕过在9中发布的问题,我必须将大键值插入和查找查询分成“一口大小”的块,以便它仍在批量处理,但不会因查询太大而超时。这样做允许在45分钟内插入86GB字典(128个线程和一些负载平衡),并且Redis查找查询(在2天内完成)不会妨碍后续处理的性能。
感谢大家的帮助和建议。

最佳答案

您可能应该使用一个旨在与许多不同进程(如数据库)共享大量数据的系统。
获取巨大的数据集并为其创建一个模式,然后将其转储到数据库中。你甚至可以把它放在一台单独的机器上。
然后,根据您的需要,跨任意多个主机启动任意多个进程,以并行处理数据。几乎任何现代数据库都能处理负载。

关于python - 用于映射大数据的Python共享内存字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49438954/

相关文章:

Java 反转映射

python - 使用字典值在两个日期之间进行 Pandas Dataframe 查询

python - 使用 MapReduce 是否可以保证具有相同键的所有值都将进入相同的 reducer?

hadoop - hadoop是大数据空间中唯一的框架吗?

python - 为什么 NumPy 中有奇怪的科学记数法?

python - 我可以为类而不是实例定义 __repr__ 吗?

python - 带有自定义选择字段的 Django 模型查询

string - Swift,使用字符串名称来引用变量

ubuntu - 如何在Ubuntu 14.04上配置Hue

python - 在 Python 中学习 CGI 编程的好资源是什么?