Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于大数据的Python更高效的HashMap(字典)_Python_String_Dictionary_Bigdata - Fatal编程技术网

用于大数据的Python更高效的HashMap(字典)

用于大数据的Python更高效的HashMap(字典),python,string,dictionary,bigdata,Python,String,Dictionary,Bigdata,我正在创建一个程序,它可以计算一个大文件中字符串的出现次数。为此,我使用了python字典,字符串作为键,计数作为值 该程序适用于多达10000个字符串的较小文件。但是,当我在实际的文件~2-3 mil字符串上进行测试时,当程序速度达到50%时,程序开始减速,达到原始速度的50%左右 我怀疑这是因为内置字典不打算处理如此大的数据量,而且会产生更多的冲突。我想知道是否有有效的方法来解决这个问题。我一直在寻找替代的hashmap实现,甚至列出了一个hashmap列表(这会进一步降低速度) 详细信息:

我正在创建一个程序,它可以计算一个大文件中字符串的出现次数。为此,我使用了python字典,字符串作为键,计数作为值

该程序适用于多达10000个字符串的较小文件。但是,当我在实际的文件~2-3 mil字符串上进行测试时,当程序速度达到50%时,程序开始减速,达到原始速度的50%左右

我怀疑这是因为内置字典不打算处理如此大的数据量,而且会产生更多的冲突。我想知道是否有有效的方法来解决这个问题。我一直在寻找替代的hashmap实现,甚至列出了一个hashmap列表(这会进一步降低速度)

详细信息:

  • 这些字符串事先不知道
  • 弦的长度范围约为10-200
  • 有许多字符串只出现一次(并且在结束时将被丢弃)
  • 我已经实现了并发以加快速度
  • 完成一个文件大约需要1小时
    • 我也做其他计算,虽然这会占用时间,但在较小的文件大小上不会减慢速度。所以我怀疑这是哈希映射或内存问题
  • 我有足够的内存,运行时只占用8GB的32GB内存
我怀疑这是因为内置字典不打算处理如此大的数据量,而且会产生更多的冲突

高冲突率不是可能的原因。Python字典会随着它们的增长而调整大小,因此不会超过三分之二的满。这将使碰撞降低到合理的速率,而不考虑碰撞的大小

可能的原因是数据增长大于三级缓存(通常约6Mb)。除此之外,常规DRAM访问的速度大约是ExtremeTech的两倍(参见下面的内存延迟图)

考虑到这是一个硬件问题,另一种字典实现将无济于事



在这种情况下,除了购买一个新的具有更多缓存的CPU,我还能做什么?我在考虑将文件拆分成更小的文件,然后分别处理它们。最终有一个最后的过程来合并所有哈希。@CJX3711一个极端的措施是编辑CPython的dictionary对象,以假设哈希匹配意味着相等。这将节省昂贵的重复字符串比较。编辑在Objects/dictobject.c lookdict()及其类似于
if(ep->me_hash==hash){return ix;}
的近亲中。这并不完美,但误报的概率为1/2**64。通过预传递,按照相关标准(如字符串长度或字符串的第一个字符)拆分文件,效果如何?选择“正确”的标准(如果没有看到数据的分布,我无法猜测),结果块会小得多,来自不同块的字符串也不可能相等。我做了更多的测试,结果表明,python哈希确实没有什么作用。我还使用了PythonDiffLib,我怀疑这是处理大量数据后速度减慢的原因。可能是因为缓存的原因?我不完全确定。在这之前的一个步骤中,我终于找到了如何减少初始数据集的方法,从而使这种减速不再成为一个问题。正如您所注意到的,创建更复杂的数据结构并不一定会使事情变得更快。Python字典经过精心设计和优化;在大多数情况下,你很难做得更好。