如何在c#中更快地读取和预处理数据
本文关键字:读取 预处理 数据 | 更新日期: 2023-09-27 18:08:11
我有一个预处理数据的算法。它与*一起使用。飞机救援消防的格式。飞机救援消防的女孩。我有一个class属性,其中包含arff文件的结构。在一个字符串中,我记录了属性的名称、它可以取的值及其出现的次数。在数值中,我记录了最小、最大平均值和标准偏差。对于小文件,它工作得很好,但对于大文件,它非常非常慢。文件可以大于10gb。
我尝试了很多选项- memorymapping Filles, BufferedStream。我认为问题在于长时间的预处理,但我不知道如何使它更快。我试过线程,但我不知道如何。
private void readDataArff()
{
string line = "";
using (StreamReader file = new StreamReader(openFileDialog1.FileName))
{
string[] data;
while ((line = file.ReadLine()) != null)
{
if ((line.Contains('%')) || (line.Contains('@')) || (line.Contains("") && (!line.Contains(','))))
continue; //skip header
data = line.Split(',');
for (int j = 0; j < attrList.Count; j++)//
{
attrList[j].FilePath = openFileDialog1.FileName;
attrList[j].Index = j;
if (attrList[j].Type1 == "STRING")
{
foreach (var item in attrList[j].Values)
{
if (item.Name == data[j])
{
item.Count += 1;
break;
}
}
}
else if ((attrList[j].Type1 == "REAL" && (line != "") && (!line.Contains('@'))) ||
(attrList[j].Type1 == "REAL" && (line != "") && (!line.Contains('@'))))
{
if ((data[j] == "?") || (data[j] == "") || (data[j] == " "))
continue;
attrList[j].Count += 1;
attrList[j].Sum = double.Parse(data[j]) + attrList[j].Sum;
double tmp = double.Parse(data[j]);
if (attrList[j].Max < tmp)
attrList[j].Max = tmp;
if (attrList[j].Min > tmp)
attrList[j].Min = tmp;
}
}
}
}
- 你可以尝试BufferedStream类,它是IStream的缓冲实现。
- 也可以编写手动方法字符串。包含(char[] chrToSeek)只扫描一次字符串。
你可以优化你的一些代码。预估一些值,如
double.Parse(data[j])