Мне нужно проанализировать 250 файлов общим объемом 1 ГБ и загрузить их на сервер SQL.Могу ли я стать более эффективным, чем это? - PullRequest
1 голос
/ 13 февраля 2012

Мой текущий метод занимает ~ 40 минут для анализа всех этих данных:

Текущая логика:

<code>foreach (var file in files)<br/>{<br/>    using (var input = new StreamReader(file.FullName))<br/>    {<br/>        while (!input.EndOfStream)<br/>        {<br/>            City parsedCity = ParseCity(input.ReadLine());<br/>        }<br/>        SQL.submit()<br/>    }<br/>}

Вы можете считать, что разбор самый быстрый.

Ответы [ 4 ]

1 голос
/ 13 февраля 2012

Попробуйте что-нибудь подобное. Поэкспериментируйте с 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

    }
}
1 голос
/ 13 февраля 2012

Исходя из того, что вы сказали, каждый файл занимает примерно 4 МБ, что не слишком много для считывания всего файла в память и выполнения разбора один раз / на строку, если вам нужно перемещаться по строковому буферу в памяти. Вы также можете использовать параллельные задачи для параллельной обработки нескольких файлов, используя преимущества многоядерного процессора.

1 голос
/ 13 февраля 2012

Скорее всего, вашим узким местом являются запросы / вставки SQL. Вы уверены, что проблема в анализе файла [s]? Если это SQL, я бы посоветовал кэшировать то, что у вас есть, а затем сделать массовую копию данных.

1 голос
/ 13 февраля 2012

вы можете попробовать разбирать файлы параллельно , а не последовательно.Вы также можете попробовать отправить sql только после разбора всех файлов.

Трудно сказать, влияют ли они на разницу, поскольку вы не предоставляете много информации о том, что делает отправка sql, но я бы сказалЯ думал, что параллельная обработка файлов определенно была бы полезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...