我当前的方法需要大约40分钟来解析所有这些数据:
目前的逻辑是:
foreach (var file in files)
{
using (var input = new StreamReader(file.FullName))
{
while (!input.EndOfStream)
{
City parsedCity = ParseCity(input.ReadLine());
}
SQL.submit()
}
}
您可能认为解析是最快的。
答案 0 :(得分:1)
您可以尝试解析文件in parallel而不是按顺序解析。您还可以尝试在解析所有文件后仅提交sql。
这些是否有任何区别很难说,因为你没有提供有关sql提交内容的大量信息,但我认为并行处理这些文件绝对是有益的。
答案 1 :(得分:1)
按照你的说法,每个文件大约大约4MB,这对于将整个文件读入内存并不太大而且如果必须在内存中的字符串缓冲区中导航则执行一次/每行解析。您还可以利用并行任务并行处理多个文件 - 利用您的多核处理器。
答案 2 :(得分:1)
最有可能的,您的瓶颈实际上是SQL查询/插入。你确定问题是解析文件[s]吗?如果是SQL,我建议缓存你拥有的东西,然后进行批量数据拷贝。
答案 3 :(得分:1)
尝试这样的事情。尝试使用maxParallelism,从系统中的核心数开始:
class Program
{
static void Main(string[] args)
{
var maxParallelism = Environment.ProcessorCount;
Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = maxParallelism }, ParseAndPersist);
}
public static void ParseAndPersist(FileInfo fileInfo)
{
//Load entire file
//Parse file
//Execute SQL asynchronously..the goal being to achieve maximum file throughput aside from any SQL execution latency
}
}