Dictionary 快速高效的map替代方案

Dictionary 快速高效的map替代方案,dictionary,go,memory-management,Dictionary,Go,Memory Management,我正在编写一个程序来识别和计算一个大表文件中的唯一条目(按GB压缩的顺序)。我目前的做法是将每个条目的名称记录在一个大的map[string]uint中,并在发现重复条目时对计数进行折扣。这很好,但在运行我的程序时,分配了8GB的RAM,我希望减少这个占用空间 我已经研究了键值数据库来存储我的数据,因为它们允许对文件进行分页并减少内存占用。不幸的是,运行一些基准测试时,我发现大多数数据库的占用空间更大,性能更慢。你有什么建议吗 BenchmarkMapRegister-4

我正在编写一个程序来识别和计算一个大表文件中的唯一条目(按GB压缩的顺序)。我目前的做法是将每个条目的名称记录在一个大的
map[string]uint
中,并在发现重复条目时对计数进行折扣。这很好,但在运行我的程序时,分配了8GB的RAM,我希望减少这个占用空间

我已经研究了键值数据库来存储我的数据,因为它们允许对文件进行分页并减少内存占用。不幸的是,运行一些基准测试时,我发现大多数数据库的占用空间更大,性能更慢。你有什么建议吗

BenchmarkMapRegister-4            500000              4678 ns/op             134 B/op          2 allocs/op
BenchmarkInsertBolt-4                100          23396720 ns/op           16524 B/op         50 allocs/op
BenchmarkInsertKV-4                10000            411216 ns/op
BenchmarkInsertGKVlite-4           30000             56059 ns/op             184 B/op          5 allocs/op
BenchmarkInsertBunt-4             100000             12795 ns/op             515 B/op          8 allocs/op
BenchmarkInsertBigCache-4         300000              4132 ns/op
BenchmarkInsertLevelDB-4           50000             28036 ns/op             497 B/op         10 allocs/op
PASS

另外,我不需要记录我的钥匙,只要能够识别它是否以前被记录过。

字符串的长度是多少,重复频率是多少,您是否关心磁盘空间?一个简单的第一步可能是散列键(如果它们很长)。如果不经常重复,您可以在bloom筛选器中记录关键帧,只存储重复并运行第二次传递以捕获第一次点击。如果分布高度倾斜,您可能会根据计数将映射划分为多个部分,从而有效地将访问较少的部分分流到较低的缓存级别和磁盘。映射速度快且内存效率高。大量数据将占用大量内存@doynax,Go的映射已经在内部散列密钥了。@Adrian:我指的是使用加密散列函数并存储它。在固定宽度的空间中挤压字符串,同时保持可忽略的碰撞概率。至于内存,明智地使用磁盘存储(外部算法)可以减少RAM的使用,同时保持合理的性能。此外,应用程序只要求实际存储重复记录,这可能只是数据的一小部分。因此,建议使用紧凑但有损的吊杆过滤器作为预通,然后解决误报。同意布卢姆/布谷鸟过滤器,肯定有很大的优势。加密散列的意义甚至更小。地图已经使用了散列,它们已经被压缩到一个固定宽度的空间中;作为一个安全的散列没有任何好处,它只会更慢。此外,不能保证哈希值(虽然可能是固定宽度的)实际上会比哈希值短-它们可能会增加空间需求。@Adrian:关键是根本不存储字符串,仅依靠散列摘要和散列函数的强度来降低冲突概率。因此,关于字符串的典型长度的问题是,如果平均字符串比替换哈希代码窄,这是一种损失。字符串的长度是多少,重复频率是多少,您是否关心磁盘空间?一个简单的第一步可能是散列键(如果它们很长)。如果不经常重复,您可以在bloom筛选器中记录关键帧,只存储重复并运行第二次传递以捕获第一次点击。如果分布高度倾斜,您可能会根据计数将映射划分为多个部分,从而有效地将访问较少的部分分流到较低的缓存级别和磁盘。映射速度快且内存效率高。大量数据将占用大量内存@doynax,Go的映射已经在内部散列密钥了。@Adrian:我指的是使用加密散列函数并存储它。在固定宽度的空间中挤压字符串,同时保持可忽略的碰撞概率。至于内存,明智地使用磁盘存储(外部算法)可以减少RAM的使用,同时保持合理的性能。此外,应用程序只要求实际存储重复记录,这可能只是数据的一小部分。因此,建议使用紧凑但有损的吊杆过滤器作为预通,然后解决误报。同意布卢姆/布谷鸟过滤器,肯定有很大的优势。加密散列的意义甚至更小。地图已经使用了散列,它们已经被压缩到一个固定宽度的空间中;作为一个安全的散列没有任何好处,它只会更慢。此外,不能保证哈希值(虽然可能是固定宽度的)实际上会比哈希值短-它们可能会增加空间需求。@Adrian:关键是根本不存储字符串,仅依靠散列摘要和散列函数的强度来降低冲突概率。因此,关于字符串的典型长度的问题是,如果平均字符串比替换哈希代码窄,则是一种损失。