如何从巨大的CSV文件中搜索数据(20Gb)C#ASP.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 [" + 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,您可以执行BULK INSERT。如果你不这样做(例如,你使用的是一个express版本(,你可能会遇到最大的表大小。在这种情况下,我从未尝试过,但您可以尝试SQLite。至少在理论上,数据库可以处理多个TB。不过,一定要在每个事务中插入大量的记录;如果你在每次插入后都提交,你的表现将非常糟糕。此外,请确保您没有创建内存中的数据库,否则您将再次耗尽内存。

最新更新