Как я могу сделать эту функцию быстрее?


У меня все большой файл все порядке продана за одну неделю. Этот файл содержит одну строку для каждого заказа. У нас есть более 5000 заказов в сутки. Это прочитать файл построчно и затем добавляет в продажу к базе данных продаж. чтобы я действительно нужно, чтобы увеличить производительность.

   static void sold4weeks1()
    {
        string sold, asin;
        string[] lines = System.IO.File.ReadAllLines(@"C:\out\qqqqq.txt");

        inventoryBLL u = new inventoryBLL();
        try
        {
            foreach (string line in lines)
            {

                char[] tabs = { '\t' };
                string[] words = line.Split(tabs);
                asin = words[12];
                sold = words[14];

                if (words[0].Substring(0, 3) == "S01") continue;
                try
                {
                    if (words[4] == "Shipped" || words[4] == "Unshipped")
                    {

                        u.setSoldin28(asin, Convert.ToInt16(sold));
                        Console.WriteLine("Update");
                    }
                }
                catch
                {
                }
            }
        }
        catch
        { }
    }


696
3
задан 23 сентября 2011 в 08:09 Источник Поделиться
Комментарии
8 ответов

Это у.setSoldin28(Асин преобразования.ToInt16(продажи)); запись в базу данных?

Сохранить все свои изменения и сделать их все в рамках одного подключения когда разбор закончен. Это должно сэкономить немного времени.

У вас есть много, хотя других проблем с этим кодом. Я настоятельно призываю вас, чтобы посмотреть на правильную обработку исключений техники.

8
ответ дан 23 сентября 2011 в 08:09 Источник Поделиться

Не использовать ReadAllLines, прочитать его построчно, это повысит производительность на много

2
ответ дан 23 сентября 2011 в 08:09 Источник Поделиться

Из выше производительности кода не должно быть большой проблемой, за исключением обработки исключений.
Значение в файле должно быть относительно быстро, тем более что ее один раз в день. Обработка этого файла, однако у меня есть к assumem здесь вопрос. Скачать профиль муравьев.
Вы вставляете данные в транзакции, и т. д. Здесь больше, чем видно.
Как уже упоминалось, попробовать/поймать будет иметь пагубные последствия, а также (мы заметили то же самое во внутренней приложение)

1
ответ дан 23 сентября 2011 в 08:09 Источник Поделиться

двигаться char массив вне цикла.

По моему опыту, используя streamreader, является самый быстрый способ, чтобы прочитать из файла.

Параллельно.Для/foreach, который на линии петли.

1
ответ дан 23 сентября 2011 в 08:09 Источник Поделиться

Вместо того, чтобы написать одну строку из продажи базы данных попробуйте следующее Для повышения производительности


  • Массовая вставка строки во временную таблицу (создать таблицу с просто
    столбец идентификаторов и строковый столбец и каждая строка будет вставлена
    в столбце строку с полем идентификатора автоинкрементное).

  • Написать хранимую процедуру, чтобы прочитать временная таблица создается выше,
    анализировать линии и отдельных полей. Вставьте отделен поля
    в основную таблицу продаж, где вы хотите, чтобы данные идут.

  • Поскольку СП будет работать под SQL-сервера, а не подключение из среды программирования на SQL будет выполняться быстрее.

    • Вы можете запланировать задание, которое будет выполняться в нерабочее время, так что других операций не затруднено.


0
ответ дан 28 сентября 2011 в 04:09 Источник Поделиться

Я пытался получить подсказку, если есть утечка производительности в код или не так, я выписал чек Consoleapp Литт для вашей проблемы. (За исключением обновления базы данных, конечно).

Это дало бы мне большой удовольствие, если вы запустите этот "анализ" с вашим кодом и после нам результаты.

using System;
using System.IO;
using System.Diagnostics;

namespace PerformanceCheck
{
class MainClass
{
public static void Main (string[] args) {
Console.WriteLine ("Press enter to write file");
Console.ReadLine ();

FileStream stream = null;
TextWriter writer = null;
try {
FileInfo info = new FileInfo ("/tmp/file.txt");
if(info.Exists)
info.Delete();

stream = info.OpenWrite ();

writer = new StreamWriter (stream);
for (int i = 0; i< 500; i++) {
writer.WriteLine ("S01\tsdf\tsdf\tsdf\tShipped\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\t" + i);
writer.WriteLine ("S01\tsdf\tsdf\tsdf\tUnshipped\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\t" + i);
writer.WriteLine ("S02\tsdf\tsdf\tsdf\tShipped\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\t" + i);
writer.WriteLine ("S02\tsdf\tsdf\tsdf\tUnshipped\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\tsdf\t" + i);
}

Console.WriteLine ("Successfully written file!");
} catch (Exception ex) {
Console.WriteLine ("Dude, Exception!");
Console.WriteLine (ex.Message);
Console.WriteLine ("Press enter to quit;");
Console.ReadLine ();
return;
} finally {
if (writer != null)
writer.Flush ();
if (stream != null)
stream.Close ();
}
Console.WriteLine ("Press enter to insert Data into Database");
Console.ReadLine ();
sold4weeks1 ();
Console.WriteLine ("Data updated, press enter to quit");
Console.ReadLine ();
}

static void sold4weeks1 () {

Stopwatch watch = new Stopwatch ();

string sold, asin;

watch.Start ();
string[] lines = System.IO.File.ReadAllLines ("/tmp/file.txt");

Console.WriteLine ("Reading lines took: " + watch.ElapsedMilliseconds + "ms");
watch.Reset ();

watch.Start ();
Stopwatch lineReadWatch = new Stopwatch ();
try {
foreach (string line in lines) {
lineReadWatch.Start ();

char[] tabs = { '\t' };
string[] words = line.Split (tabs);
asin = words [12];
sold = words [14];

if (words [0].Substring (0, 3) == "S01")
continue;
try {
if (words [4] == "Shipped" || words [4] == "Unshipped") {

int i = Convert.ToInt16 (sold);
Console.WriteLine ("Update: "+i);
}
} catch {
} finally {
lineReadWatch.Stop ();
lineReadWatch.Reset ();
Console.WriteLine ("Handling of line took: " + lineReadWatch.ElapsedMilliseconds + "ms");
}
}
} catch {
}
Console.WriteLine ("Whole routine took: " + watch.ElapsedMilliseconds + "ms");
watch.Stop ();
}

}
}

Разработана и успешно апробирована на моно айфон

Насколько я вижу, да есть некоторые моменты, где производительность может быть получена, но я бы быть заинтересованы, если это действительно узкое место. Как и другие, прежде чем я считаю, что огромный прирост производительности может быть сделано в коде обновления базы данных.

Но я готов быть profen не так, и поэтому я был бы очень заинтересован в вашем исполнении замеров!

Сниппет Вывода:


Обработка линии: 0мс

Обновление: 499

Обработка линии: 0мс

Вся процедура заняла: 38ms

Обновленные данные, нажмите Enter для выхода

0
ответ дан 29 сентября 2011 в 08:09 Источник Поделиться

В первую очередь важно сделать профили производительности. Я советую создать dottrace от http://www.jetbrains.com/profiler/.
С помощью этого получить базовые цифры. Эти базовые цифры будут большие, чтобы доказать улучшение производительности.

Важно также писать масштабируемый код. Вместо того, чтобы загружать все 5000 строк в памяти, попробуйте использовать полномочия базе, как полагают samiksc

0
ответ дан 3 октября 2011 в 07:10 Источник Поделиться

Это действительно необходимо для повышения производительности?
Это типичное задание, которое может работать в ночное время в течение нескольких часов без каких-либо проблем. Просто сделать его рок-твердый (во-первых, удалить пустой блок catch, большая ошибка). Нет необходимости в сложных логических или хитрые уловки.

Если это займет неприемлемое время для обработки данных, узким местом должен быть в классе inventoryBBL (или как вы используете его). Не вносить изменения в базу данных после каждого изменения (пакетная обработка). А .Чистый профайлер и профайлер базы данных также хорошие идеи. Сколько времени вы проводите в код .Чистый код и сколько в SQL время по сравнению с временем обработки?

0
ответ дан 4 октября 2011 в 02:10 Источник Поделиться