我需要建议如何将数十亿的ulong值映射到几个int值.在最坏的情况下,我有超过110亿(基本上是随机的ulong值),需要映射到40个int值.映射是已知的,除了所需的内存量之外,字典也可以工作.目前,估计在使用字典时,大约199GB的RAM将用于所有需要的映射.
有没有人知道任何类型的算法或过程可用于完成此映射而不消耗如此多的RAM?
我正在研究一个C# – .NET 4.5程序,以帮助过滤我的数据并遇到效率问题.我目前正在通过8(我最终需要做20个)不同的过滤器运行我的数据,每个过滤器以相同的方式过滤数据,但是在不同的级别.在过滤器过程中的某个点,每个级别都有许多必须编码到最终输出值中的值.
一些例子:
在级别3,有23个值被编码为6个可能的输出值(0-5).
在级别7,有2,576个值被编码为14个可能的输出值(0-13).
在级别10,有88,215个值被编码为20个可能的输出值(0-19).
当我达到20级时,我将有超过11亿个值被编码为40个输出值(0-39).
要为每个过滤器编码的值都是事先已知的,我正在从文件中读取此信息并为每个过滤器填充单独的字典(当前为1到8).按照这个速度,当我进入过滤器20时,将有超过16.5亿个字典条目,其中大多数是ulong值.
从长远来看,这不是解决方案.
有没有人知道如何更有效地将数百万个独特的输入值映射到几个独特的输出值?
是否有算法将输入映射到输出?
我正在寻找可能指向正确方向的任何想法.
解决方法
要创建索引数组,您将逐行读取CSV文件.对于每个datapair(input_int,output_int),创建新的datapair(索引,32位值).索引占用input_int的前2个字节,并创建32位值,连接input_int的最后3个字节和output_int的唯一字节.如果索引从先前的datapair更改,则将文件的位置存储到新索引处的数组.在任何情况下,将32位值附加到文件.重复直到CSV文件结束.
所以假设我们有一个输入值0x1234567890并需要相应的输出值.算法会在内存中找到索引为0x1234和0x1235的项目.这将为您提供项目所在文件中的开始和结束位置.在此范围内,我们为值0x567890执行binary search并获取其后的字节.这是我们的产值.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。