C# 如何存储web应用程序用于单词搜索的5GB文本文件?

C# 如何存储web应用程序用于单词搜索的5GB文本文件?,c#,sql,asp.net,C#,Sql,Asp.net,我有5 GB的txt文件,其中包括2200000个单词及其数字向量的记录 当用户在我的web应用程序的txt框中输入查询时,我希望在文本文件中搜索单词,并在txt文件中查找结果向量 它是一个常量txt文件,我不想在其中添加任何内容 现在我最好使用这个txt文件或使用DB,因为它是一个web应用程序,响应时间对我来说很重要 Txt文件是手套(单词表示的全局向量)。 每个记录都是这样的: 0.418 0.24968-0.41242 0.1217 0.34527-0.044457-0.49688-0.

我有5 GB的txt文件,其中包括2200000个单词及其数字向量的记录
当用户在我的web应用程序的txt框中输入查询时,我希望在文本文件中搜索单词,并在txt文件中查找结果向量
它是一个常量txt文件,我不想在其中添加任何内容 现在我最好使用这个txt文件或使用DB,因为它是一个web应用程序,响应时间对我来说很重要

Txt文件是手套(单词表示的全局向量)。
每个记录都是这样的:

0.418 0.24968-0.41242 0.1217 0.34527-0.044457-0.49688-0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279 -0.1552 -0.23131 -0.19181 -1.8823 -0.76746 0.099051 -0.42125 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637 -0.44251 0.18785 0.0027849-0.18411-0.11514-0.78581


两者都是基于文件的,但数据库组织数据(索引等),缓存查询和过程,强制执行安全性、规则和数据完整性。这样可以更快地查询所需的数据。您还可以使用多个选项和计划备份数据。您可以根据日期限制有条件地存档。所有这些都很难用平面锉来完成

你需要考虑你的具体情况,检查每种方法的利弊。< /P>
考虑到您的问题将来可能会扩大,如果您没有正确地设计解决方案,您可能会依赖于文件方法,并且在尝试转换为第二种方法时会花费更多的时间。因此,要明智地设计,以便于转换方法。

txt文件足够大,如果您不使用db,每次您都会将txt文件加载到内存中并进行全文搜索,或者在开始时,您将缓存txt文件并从缓存的数据中进行全文搜索。您应该避免每次都将txt文件加载到内存中。相反,如果您不想使用db,当应用程序启动时,您可以将txt文件加载到内存中,然后将txt文件数据加载到索引组件中,如C#中的Dictionary。但是,由于数据太大,行计数也可能太大,因此从内存工作可能会降低速度


我认为最好的解决方案是使用数据库和索引表。

可能非常适合SQLite。
创建一个包含两列的表-“word”和“vector”,导入数据,在“word”上创建索引,就完成了


演示 生成文件 蟒蛇

with open(r'c:\Temp\glove.txt','w') as f:
    for i in range(0,13000000):
        f.write('{}|{}\n'.format(1000001+i,'0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279 -0.1552 -0.23131 -0.19181 -1.8823 -0.76746 0.099051 -0.42125 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637'))
检查文件大小 指令

创建SQLite数据库+加载数据+构建索引
搜寻
另一种选择是使用基于键/值的NoSQL解决方案,如Azure Table Storage()。他们擅长根据密钥快速获取数据。它们的伸缩性也很好

对于Azure表存储,分区键可以是单词的第一个字符,行键可以是整个单词。然后,该值就是向量。在您的情况下,您可以基于分区和行键创建一个查询,这非常快(请参阅“严重问题–太快了”一节)


> Azure表存储有其他替代方案,比如ReISIS或MimCaseDB。

我会考虑基于DBMS的解决方案。如果设计得当,很难击败。尝试这两种方法并衡量时间(1)这篇文章与“大数据”无关。(2) 我建议展示一个数据样本
c:\Temp>dir glove.txt

 Directory of c:\Temp

12/04/2016  12:26 PM     5,204,000,001 glove.txt
               1 File(s)  5,204,000,001 bytes
c:\Temp>sqlite3 glove.db
SQLite version 3.15.1 2016-11-04 12:08:49
Enter ".help" for usage hints.
sqlite> create table glove (word text,vector text);
sqlite> .import 'c:\Temp\glove.txt' glove
sqlite> create unique index glove_un_word on glove(word);
sqlite> .timer on
sqlite> select vector from glove where word = '7654321';
0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279
0059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637
Run Time: real 0.004 user 0.000000 sys 0.000000
sqlite>