Поиск больших файлов Excel и эффективная обработка больших объемов данных - PullRequest
0 голосов
/ 23 июня 2011

Я начал работу над проектом, вот что у меня есть:

Файл Excel (exl1), содержащий 450 КБ записей, с 50 КБ каждый месяц.

формат exl1

invoice#|Box#|Serial-#1|Serial-#2|5-val-enum#1|5-val-enum#2|10-val-enum|4-val-enum|timestamp

ex1: abc123|box1|0987654321|A123456789|Plant|Tree|PersonName1|North|DateTime.Now

ex2: qwe345|box9|12345678901234567890|#NA|Animal|Cat|PersonName1|South|DT.Now

Файл Excel (exl2), содержащий примерно 50 тыс. Записей.(по имени searchcVal для целей объяснения) exl2 формат Serial1

ex1a: A123456789

ex1b: 0987654321

ex2a: 12345678901234567890

Вот что я должен сделать:

  1. Сравните каждое значение в exl2 (searchval) с Serial # 1 или Serial # 2 в зависимости от значения 5-val-enum # 1 из exl1(example1 = Plant, example2 = Animal)

  2. , если searchVal начинается с [az] search serial2, иначе search serial1;Итак, с помощью searchVal ex1a search col3 и serachval ex1b search col2

        if (exl1.Rows[columnHeader][col4].ToString() == "Plant")
        {
            string rowVal = exl2.Rows[rowIterator][col0].ToString();
            if (regex.IsMatch(rowVal[0].ToString()))//checks to see if serial1 or  serial2
            {
                if (rowVal == exl1.Rows[rowIterator][col3].ToString())
                {
                    //add matched row to ResultsDT
                }
                else
                {  //next row
                }
            }
            else
            { //search col2 with same procedure
            }
        }
        else
        {//search col2
        }
    
  3. ради объяснения скажем, что Person1 сопоставил 400 растений, из которых 100 были деревьями, 100 были кустами, 100 былитравы и 100 были цветами, и он сопоставил 400 животных, из которых 100 были кошками, собаками, змеями и птицами каждое.с этими совпадениями я хотел бы суммировать это к выводу РЕЗЮМЕ1: PersonName | Растения | Животные | category3 | Category4 | Category5 с более подробным для каждой из категорий, таких как РЕЗЮМЕ 2: PersonName | Деревья | Кусты | Травы | Цветыведущий к сумме 1: человек1 | 400 | 400 | х | п | у сумм 2 (только растения): человек 1 | 100 | 100 | 100 | 100

  4. Самое главное: делать все это без убийстваПК работает 3 часа, пока он вычисляет

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

Есть как минимум два варианта:

  1. Рассматривайте Excel как базу данных и проверяйте ее производительность - вот как это сделать: http://www.beansoftware.com/NET-Tutorials/Excel-ADO.NET-Database.aspx.
  2. Если опция № 1 слишком медленная, импортируйте эти данные в реальную базу данных (ms sql, mysql, postgresql и т. Д.), Добавьте соответствующие индексы и выполните поиск в базе данных. Excel будет рассматриваться как источник данных для первоначального импорта.
1 голос
/ 23 июня 2011

Я предполагаю, что вопрос здесь заключается в том, «как я могу эффективно выполнять эти задачи?»

Ответ таков: не стоит.Похоже, вы пытаетесь сделать OLAP по дешевке (за исключением того, что, возможно, это не происходит строго в Интернете), и для этого уже есть множество решений.

Поскольку у вас уже есть установленная процедура использования таблицы Excel, PALO может удовлетворить ваши потребности ( edit: бесплатно).

В качестве альтернативы, то, что у вас естьявляется денормализованным набором записей;если вы нормализуете его в несколько наборов и вводите его в базу данных (очевидно, используя скрипт), вы можете позволить своей базе данных позаботиться об интенсивных вычислениях. Редактировать: Существует множество бесплатных баз данных, которые вы можете использовать ( SQL - это язык, а не бренд).Например, PostgrSQL , MySQL

Если вы настаиваете на синтаксическом анализе файлов и анализе файлов самостоятельно, то я предлагаю вам изменить свой алгоритм, чтобы сделать 2 вещи:

Во-первых, получите набор из 50 тыс. Записей, чтобы поместиться в как можно меньший объем памяти.Очевидно, что вы не хотите хранить свои записи в виде строк размером 50 Кб: проанализируйте их и создайте структуру памяти, которая позволит вам получать доступ только к той информации, которая вам нужна. Редактировать: Неважно, неправильно ваш вводdata.

Во-вторых, измените ваш алгоритм так, чтобы он мог выполняться по частям.В настоящее время у вас есть 1 набор записей по 50 КБ и еще один набор записей по 450 КБ. Похоже, вы ожидаете, что ваша программа будет запускаться каждый месяц (или чаще) с полным набором записей + независимо от того, какие записи были добавлены в набор 450 КБ.записей.Если вы начнете хранить инкрементные результаты, вы можете структурировать свой сценарий так, чтобы он обрабатывал (например) до 10 тыс. Записей за раз из набора записей 450 тыс. За раз, а также последовательно запускал несколько экземпляров сценария.- анализировать все 450 тыс. записей каждый месяц, а также иметь удобный способ остановить и запустить процесс на полпути (используя некоторый родительский сценарий).

Для более сложного подхода, посмотрите Разделяй и властвуй в применении к алгоритмам.

1 голос
/ 23 июня 2011

В зависимости от соотношения количества обновлений Excel / количества выполненных запросов, было бы неплохо просто прочитать значения в базу данных сервера SQL и запросить / обработать данные там? Я полагаю, что для считывания значений на сервер sql требуется некоторое время, но запросы не должны занимать время ...

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