搜索大量大文本的最快方法

2024-02-11

我有一个用 C# 编写的 Windows 应用程序,需要从数据库加载 250,000 行,并提供“键入时搜索”功能,这意味着只要用户在文本框中键入内容,应用程序就需要搜索所有 250,000 条记录(其中顺便说一句,单列,每行 1000 个字符)使用like搜索并显示找到的记录。

我遵循的方法是:

1-应用程序将所有记录加载到类型中List<EmployeeData>

while (objSQLReader.Read())
{
    lstEmployees.Add(new EmployeesData(
        Convert.ToInt32(objSQLReader.GetString(0)),
        objSQLReader.GetString(1), 
        objSQLReader.GetString(2)));
}

2-在 TextChanged 事件中,使用LINQ,我搜索(结合正则表达式)并附上IEnumerable<EmployeesData>到处于虚拟模式的 ListView。

String strPattern = "(?=.*wood*)(?=.*james*)";
    IEnumerable<EmployeesData> lstFoundItems = from objEmployee in lstEmployees
    where Regex.IsMatch(Employee.SearchStr, strPattern, RegexOptions.IgnoreCase)
    select objEmployee;
    lstFoundEmployees = lstFoundItems;

3- 处理 RetrieveVirtualItem 事件以在 ListView 中显示项目以显示该项目。

e.Item = new ListViewItem(new String[] { 
    lstFoundEmployees.ElementAt(e.ItemIndex).DateProjectTaskClient, 
    e.ItemIndex.ToString() });

虽然lstEmployees从 SQL Server 加载列表的加载速度相对较快(1.5 秒),在 TextChanged 上搜索,使用 LINQ 搜索需要 7 分钟以上。通过执行以下命令直接通过 SQL Server 进行搜索LIKE搜索时间不到 7 秒。

我在这里做错了什么?我怎样才能让这个搜索更快(不超过2秒)?这是我的客户的要求。因此,我们非常感谢任何帮助。请帮忙...


存储文本数据的数据库列是否有索引?如果是这样,类似于trie structure http://en.wikipedia.org/wiki/Prefix_tree尼古拉斯描述的那个已经在使用了。 SQL Server 中的索引是通过以下方式实现的B+ trees http://en.wikipedia.org/wiki/B+_tree,其平均搜索时间约为 n 的以 2 为底的对数,其中 n 是树的高度。这意味着,如果表中有 250,000 条记录,则搜索所需的操作数为以 2 为底的对数 (250,000) 或大约 18 次操作。

当您将所有信息加载到数据读取器中,然后使用 LINQ 表达式时,这是一个线性运算 (O) n,其中 n 是列表的长度。最坏的情况是 250,000 次操作。如果您使用 DataView,将会有索引可用于帮助搜索,这将大大提高性能。

最终,如果不会向数据库服务器提交太多请求,则可以利用查询优化器来执行此操作。只要在字符串前面不使用通配符执行 LIKE 操作即可(即LIKE %some_string)(否定索引的使用)并且表上有索引,您将获得非常快的性能。如果要提交到数据库服务器的请求太多,则可以将所有信息放入 DataView 中,以便可以使用索引,或者使用上面 Tim 建议的字典,其搜索时间为 O(1 )(大约为一),假设字典是使用哈希表实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索大量大文本的最快方法 的相关文章

  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 如何延迟 html 文本的显示,直到加载背景图像精灵?

    这是我想使用 jQuery 控制的一些示例代码 黑色页面背景上的白色按钮背景 ul class buttons li class button displays a href products Products and Services f
  • 连接语句省略条目

    使用 Unix 2 6 18 194 el5 我遇到一个问题 该连接语句省略了匹配中的值 索引 我发现这些值在 11 90 之间 大约 350 万个条目 并且我尝试查找外来字符 但我可能忽略了某些内容 尝试使用 cat v 来查看隐藏字符
  • 雾化T的.Net Collection?

    我正在寻找是否有一个预先存在的 Net 哈希集类型 实现适合原子化一般类型 T 我们有大量相同的对象用于序列化源 需要原子化以节省内存 A Dictionary
  • union '双关语'结构带有“公共初始序列”:为什么 C (99+) 而不是 C++ 规定了“联合类型的可见声明”?

    背景 通过以下方式讨论类型双关的大多数非或实现定义的性质union通常引用以下位 此处通过 ecatmur https stackoverflow com a 31557852 2757035 https stackoverflow com
  • Angular 2 - 警告/提示的表单验证

    我正在尝试添加不会使表单无效的表单验证 验证应仅显示为警告 例如 年龄验证 年龄大于 90 表示警告 年龄大于 120 表示错误 我已经尝试过在表单上使用两个 FormGroup 并在输入字段上使用两个 formControl 仅使用第一个
  • 正确管理addObserverForName:object:queue:usingBlock:

    我对 Objective C 中的块仍然很陌生 想知道我的伪代码是否正确 我不确定仅删除观察者是否足够 或者是否必须调用removeObserver name object void scan Scanner scanner Scanner
  • 使用 Powershell 将 EBS 卷附加到 Windows EC2 [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我看到很多关于在 Linux 上添加 EBS 卷的问题得到了解答 但在 Windows 上却没有 假设您发现磁盘空间不足 可能通过 C
  • 带通配符的 spring

    我想从多个位置加载键值对 我的第一个猜测是
  • 仅使用 JavaScript 的递归 HTML 表格树

    我开发了单击父节点来显示其子行 我只需要启用单击子数据即可将其子子行作为递归树或表树打开 有人可以添加你的逻辑来帮助我理解并帮助其他人吗 document getElementById products addEventListener c
  • 气流日志文件不存在:

    Airflow 在几周内工作正常 但突然开始出现几天错误 Dags 会因此错误而随机失败 日志文件不存在 airflow path 1 log获取自 http 8793 airflow path 1 log 无法从工作人员获取日志文件 对
  • Patentsview API Python 3.4

    我是Python的初学者 目前正在使用Python开发一个小项目 我想为 Patentsview org 的专利研究构建一个动态脚本 这是我的代码 import urllib parse import urllib request http
  • Android:带有链接链接的可点击 TextView

    我的布局中有一个 TextView 它在 XML 中设置了一个属性 clickable true 这是为了让它表现得像一个带有文本和图标的按钮 现在 我通过调用 HTML fromHtml 添加到 TextView HTML 文本 然后应用
  • 支持样式标签的 HTML Sanitizer for .NET

    我正在寻找一个好的 HTML 清理程序以在 ASP NET 项目中使用 问题是清理程序必须支持样式属性 这些属性可能包含 CSS 属性 这些属性也必须被清理 到目前为止我还没有找到一个好的产品可以使用 在我硬着头皮写自己的消毒剂之前 我想我
  • 在不能抛出的地方抛出NullPointerException

    我在一段无法抛出 NullPointerException 的代码中得到一个 NullPointerException 我开始认为在 JRE 中发现了一个错误 我使用javac 1 8 0 51作为编译器 问题出现在jre 1 8 0 45
  • 在 Electron process.stderr 中未定义

    我正在尝试在我的 Electron 应用程序中使用 sqlite3 nodejs 插件 我在加载 sqlite3 模块时遇到错误 查看崩溃的堆栈跟踪 我发现 sqlite3 有多个依赖项 其中之一是日志库 npmlog 该库尝试从以下位置初
  • Google Glass:执行“点击”事件或类似的事件

    请看下面的代码
  • 在 ES6 中如何调用我的类的父类的父类的构造函数?

    我正在使用 ES6 类 我的类 A 扩展了类 B 类 B 扩展了类 C A 如何扩展一个方法 然后调用该方法的 C 版本 class C constructor console log class c class B extends C c
  • 如何在 SQL Server Express 表中保存 QTime 并读取它?

    我在 SQL Server Express 中有一个包含字段的表name varchar 10 and timeVar time我想保存 a 的值QTime变量在time field 这是我尝试过的 QTime time QTime cur
  • 无法按名称激活工作表

    我试图在打开电子表格时根据当前月份激活每月工作表 问题出在脚本末尾 无法选择工作表 看起来getSheetByName gets a null值 不被接受setActiveSheet function selectmonth var now
  • 搜索大量大文本的最快方法

    我有一个用 C 编写的 Windows 应用程序 需要从数据库加载 250 000 行 并提供 键入时搜索 功能 这意味着只要用户在文本框中键入内容 应用程序就需要搜索所有 250 000 条记录 其中顺便说一句 单列 每行 1000 个字