c# - 针对 +5M 记录表进行快速内存范围查找

标签 c# performance azure lookup-tables

我有一个数据库表,其中包含超过 5M 的静态记录。简单的结构:(起始int,结束int,结果int)。所以我有一个特定的 INT,我需要找到它对应的结果(int)。目前,查找表位于数据库中,但它需要驻留在内存中,很可能是在没有数据库访问的环境中。

我的解决方案需要在没有数据库访问的情况下在内存中以超快的速度执行此逻辑,因为我需要每秒处理 1000 个事务。该集合的大小略高于 50MB,因此我可以将整个内容放入内存中并针对它运行范围查找,根据这篇文章:Doing a range lookup in C# - how to implement 。但我不知道在如此规模下它会表现如何。

  • 我是否“在启动时”预加载该表?它可能需要一段时间。
  • 有什么方法可以将表加载到某个 .dat 文件中并在运行时进行超高效的查找吗?

顺便说一句,我在 Azure 上,不确定使用存储表是否有助于查找...

最佳答案

二分查找速度非常快。对 50M 条记录进行二分查找只需 27 次比较即可找到答案。只需将其加载到内存中并使用您链接的范围查找即可。

如果您发现速度很慢,请开始优化:

  • 将 Range 对象更改为结构体而不是类
  • 手动编写您自己的二分搜索算法,该算法 (a) 直接实现相等比较器,而不是调用 IEqualityComparer,并且 (b) 使用指针和其他不安全的技巧来禁用数组边界检查进行搜索。

关于c# - 针对 +5M 记录表进行快速内存范围查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262525/

相关文章:

c# - 哪些实际应用程序使用 Windows Workflow Foundation 技术?

c# - Unity3D iOS 64 位的 IL2CPP 编译器运行时错误

c++ - 静态语言的运行时优化 : JIT for C++?

c# - Interop.excel 应用程序到 Azure Web 应用服务

asp.net-mvc - 跨 mvc 应用程序传递 azure token

linux - 如何为 Azure linux (ubuntu) DSC 盒运行的 bash 脚本启用完整的标准输出日志

c# - 搜索换行符 C#.net

c# - BalloonTipClicked(关闭/显示)发件人/EventArgs

java - 哪个更有效率?

performance - 为基于文本的 PG 恢复调整哪些参数?