Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从巨大的CSV文件(20Gb)C#ASP.NET中搜索数据_C#_Asp.net_.net - Fatal编程技术网

如何从巨大的CSV文件(20Gb)C#ASP.NET中搜索数据

如何从巨大的CSV文件(20Gb)C#ASP.NET中搜索数据,c#,asp.net,.net,C#,Asp.net,.net,我想创建一个程序,使用.Net读取或搜索20Gb CSV文件中的数据 有什么办法吗 我的搜索代码 string search = txtBoxSearch.Text; string pathOnly = Path.GetDirectoryName(csvPath); string fileName = Path.GetFileName(csvPath); string sql = @"SELECT F1 AS StringID, F2 AS StringContent FROM [&

我想创建一个程序,使用.Net读取或搜索20Gb CSV文件中的数据

有什么办法吗

我的搜索代码

string search = txtBoxSearch.Text;
string pathOnly = Path.GetDirectoryName(csvPath);
string fileName = Path.GetFileName(csvPath);

string sql = @"SELECT F1 AS StringID, F2 AS StringContent FROM [" + fileName + "] WHERE F2 LIKE '%" + search + "%'";

using (OleDbConnection connection = new OleDbConnection(
        @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathOnly +
        ";Extended Properties=\"Text;HDR=No\""))
using (OleDbCommand command = new OleDbCommand(sql, connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
        DataTable dataTable = new DataTable();
        adapter.Fill(dataTable);
        dataTable.Columns.Add("MatchTimes", typeof(System.Int32));

         foreach (DataRow row in dataTable.Rows)
         {
                 row["MatchTimes"] = Regex.Matches(row["StringContent"].ToString(), search).Count;
         }

         GridViewResult.DataSource = dataTable;
         GridViewResult.DataBind();
生成CSV文件的代码

int records = 100000;

File.AppendAllLines(csvPath, 
   (from r in Enumerable.Range(0, records) 
      let guid = Guid.NewGuid() 
      let stringContent = GenerateRandomString(256000) 
      select $"{guid},{stringContent}"));

这实际上取决于您的搜索方式。如果你只是做一次搜索,你可以一次只读一行,然后做字符串比较或者其他什么。如果你这样做了,不要把整个东西加载到内存中——一次加载一个


如果您有权访问SQL Server的“完整”版本,则可以进行批量插入。但是,如果您不这样做(例如,您正在使用一个express版本),则可能会遇到最大表大小。在本例中,我从未尝试过这个,但您可以尝试SQLite,该数据库可以处理多TB的数据。不过,要确保在每笔交易中插入大量记录;如果您在每次插入后都进行提交,那么您的性能将非常糟糕。另外,请确保您没有创建内存中的数据库,否则会再次耗尽内存。

这实际上取决于您的搜索方式。如果你只是做一次搜索,你可以一次只读一行,然后做字符串比较或者其他什么。如果你这样做了,不要把整个东西加载到内存中——一次加载一个


如果您有权访问SQL Server的“完整”版本,则可以进行批量插入。但是,如果您不这样做(例如,您正在使用一个express版本),则可能会遇到最大表大小。在本例中,我从未尝试过这个,但您可以尝试SQLite,该数据库可以处理多TB的数据。不过,要确保在每笔交易中插入大量记录;如果您在每次插入后都进行提交,那么您的性能将非常糟糕。另外,请确保您没有创建内存中的数据库,否则会再次耗尽内存。

有什么方法可以做到这一点吗?在我看来,你已经做到了。显示的代码有什么问题?您的Csv只有两列?并且数据中没有coma
。因此,简单的字符串操作就足够了,而不是完整的
OleDbConnection
。您应该只添加与网格匹配的线。您甚至可以使用字符串拆分,在其中指定预期结果的数量,以便忽略所需的所有内容column@Steve我收到一个错误System.Data.OleDb.OLEDBEException:'查询无法完成。查询结果的大小大于数据库的最大大小(2 GB),或者磁盘上没有足够的临时存储空间来存储查询结果。'因为CSV文件将不会出现。。。。哈哈,也许吧,但不是真的有多少行是20Gb。。。。您需要将其导入数据库。。或者更擅长做基于索引的搜索之类的。否则,您将不得不读取为流。。。。以某种方式20GB是一个非常像数百万行的容量。。。。两亿多是的!因为为什么OleDB用于简单的CSV?我指的是一个简单的
var lines=File.ReadLines(文件名);foreach(var line in line){//split on comma take第二个元素索引[1]//regex match//add to the source}
有什么办法吗?在我看来,你已经做到了。显示的代码有什么问题?您的Csv只有两列?并且数据中没有coma
。因此,简单的字符串操作就足够了,而不是完整的
OleDbConnection
。您应该只添加与网格匹配的线。您甚至可以使用字符串拆分,在其中指定预期结果的数量,以便忽略所需的所有内容column@Steve我收到一个错误System.Data.OleDb.OLEDBEException:'查询无法完成。查询结果的大小大于数据库的最大大小(2 GB),或者磁盘上没有足够的临时存储空间来存储查询结果。'因为CSV文件将不会出现。。。。哈哈,也许吧,但不是真的有多少行是20Gb。。。。您需要将其导入数据库。。或者更擅长做基于索引的搜索之类的。否则,您将不得不读取为流。。。。以某种方式20GB是一个非常像数百万行的容量。。。。两亿多是的!因为为什么OleDB用于简单的CSV?我指的是一个简单的
var lines=File.ReadLines(文件名);foreach(行中的var行){//split on comma获取第二个元素索引[1]//regex match//add to the source}