Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
Здравствуйте!

SAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?
2 окт 17, 10:54    [20835654]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
hVostt
Member

Откуда:
Сообщений: 11770
iMrTidy,

оптимизации. если взять библиотеку для работы с Excel — Aspose Cells, она работает ещё быстрее, чем Excel, и вообще быстрее ничего я ещё не видел. но она платная, конечно :)
2 окт 17, 11:25    [20835758]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
Aspose Cells,

Неужели можно наоптимизировать тот же SAX, что будет работать в 100 раз быстрее? Мне кажется, что речь идет о каком-то кардинально другом подходе, которым Майкрософт не захотел делиться, открыв тем самым дверь для коммерческих вариантов.
2 окт 17, 13:33    [20836231]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
Изопропил
Member

Откуда:
Сообщений: 30646
iMrTidy
SAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?

не в парсере дело(хотя и в нём что-то можно отжать)), а в о внутреннем представлении документа, которое вовсе не DOM-дерево
2 окт 17, 14:58    [20836515]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
Изопропил,

Сохраняется документ как набор зипованых XML файлов, т.е. в конечном счете и Excel сохраняет все как DOM-дерево, только в разы быстрее.
2 окт 17, 15:11    [20836550]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
Изопропил
Member

Откуда:
Сообщений: 30646
iMrTidy,

я о внутреннем представлении собственно в Excel .
а внутреннее представление влияет на скорость XML сериализации-десериализации
2 окт 17, 15:15    [20836559]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
Изопропил,

Тогда логично будет спросить, а почему они не сделали похожий подход в OpenXML?
2 окт 17, 15:23    [20836593]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy
Здравствуйте!

SAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?
Неужели в сто? Где пруф? Где тестовый пример?
2 окт 17, 15:25    [20836604]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg
iMrTidy
Здравствуйте!

SAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?
Неужели в сто? Где пруф? Где тестовый пример?


Вот пример, вместо Rand можно просто число, на рабочем компьютере заняло секунд 20, аналогичная операция в Excel менее секунды, это уже как минимум в 20 раз разница. Если DOM, то после 25 минут дело так и не дошло до конца.
2 окт 17, 15:40    [20836641]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
Изопропил
Member

Откуда:
Сообщений: 30646
iMrTidy
Изопропил,

Тогда логично будет спросить, а почему они не сделали похожий подход в OpenXML?

чтоб эксель всегда был быстрее наколенных приблуд ))
2 окт 17, 16:04    [20836722]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy
refreg
пропущено...
Неужели в сто? Где пруф? Где тестовый пример?


Вот пример, вместо Rand можно просто число, на рабочем компьютере заняло секунд 20, аналогичная операция в Excel менее секунды, это уже как минимум в 20 раз разница. Если DOM, то после 25 минут дело так и не дошло до конца.
Открыл Excel. Заполнил матрицу слчис 100*50000. Включил таймер. Нажал сохранить. Отключил таймер. 25 секунд.
В примере 18 секунд (на своем компе пример не проверял)
2 окт 17, 16:25    [20836800]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg,

Кодом 6 секунд:
+
Option Explicit

Sub test()

Dim t As Double

t = Timer

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

ThisWorkbook.Sheets(1).Range("A1:CV50000") = 111
ThisWorkbook.Save

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

Debug.Print (Timer - t) * 1000

End Sub


Из буфера обмена, такой же объем, почти мгновенно.
2 окт 17, 17:26    [20837010]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy,

Нельзя одинаковое поле на все ячейки. При записи хак есть для этого (емнип). Или используй этот же хак в OpenXML.

Сверь размеры получаемых файлов.
2 окт 17, 17:47    [20837069]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg,

Если Вы про SharedStringTable, то в этом случае она не сработает, т.к. значение числовое.

С размером все в порядке.

Что кодом через Excel, что вставкой через буфер обмена, что OpenXML, структура получается одинаковой, т.е. 5 млн ячеек.

Что значит хак? Что такое емнип?
2 окт 17, 17:59    [20837109]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy
refreg,

Если Вы про SharedStringTable, то в этом случае она не сработает, т.к. значение числовое.

С размером все в порядке.

Что кодом через Excel, что вставкой через буфер обмена, что OpenXML, структура получается одинаковой, т.е. 5 млн ячеек.

Что значит хак? Что такое емнип?
Ну 20 к 6 - это уже не 100 к 1. Дальше не интересно. Ищи ошибки в своих тестах.
2 окт 17, 18:29    [20837168]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg,

Вот уж не думаю, что Вам было интересно разобраться в проблеме изначально.
3 окт 17, 09:59    [20838073]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy
refreg,

Вот уж не думаю, что Вам было интересно разобраться в проблеме изначально.
Почему же. Я же указал, в чем была проблема первого теста 20836800. Досконально, с каждым придуманным тестом возиться нет желания. А библиотека хороша хотя бы тем, что не требует установленного офиса... Если наличие Excel для проекта некритично, выбирай что быстрей нравится.
3 окт 17, 11:29    [20838409]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg,

Ваша позиция мне ясна. Давайте, не будем тратить время на бесполезный оффтоп?

Возможно, кому-то пригодится.
Результат на текущий момент.
1. Создание 5 млн ячеек при помощи OpenXML DOM занимает более 25 минут. Кстати, на сайте Майкрософт ошибка, о чем я им указал.
2. Создание 5 млн ячеек при помощи OpenXML SAX занимает порядка 20 секунд.
3. Создание 5 млн ячеек через Excel VBA (пример был выше) занимает порядка 6 секунд.
4. Создание 5 млн ячеек вставкой в Excel через буфер обмена менее 1 секунды.

После весьма основательного ресерча в Интернете и ряда тестов, я пришел к выводу, что
1. Быстрее чем SAX через OpenXML сделать не получится. Почему такая разница между 3,4 и 1 можно только предполагать.
2. Вероятно, DOM медленно работает с большими объемами, т.к. все дерево загружается в память, и каждое создание/обращение к ячейке приводит к прохождению по дереву, т.е. чем больше ячеек тем медленне и медленне становится работа.
3. Работать с SAX менее удобно, чем с DOM, особенно, если нужно создавать/обновлять выборочные ячейки в уже имеющемся документе.
4. DOM прекрасно справляется с объемами до 10 000 ячеек как чтение, так и запись. В большинстве случаев занимает менее секунды.
5. DOM методом довольно быстро и просто получилось написать библиотеку для работы с Excel, которая позволяет обращаться к Sheets и Ranges почти как в Excel, и в то же время позволяет рабоать с LINQ. К сожалению, не могу поделиться кодом, но указанных ссылок должно быть достаточно, чтобы разобраться что к чему.
3 окт 17, 12:39    [20838628]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy,

Все таки, в твоих тестах путаница между созданием и сохранением.
Где пункт, что Excel сохраняет 5 млн ячеек 25 секунд?

iMrTidy
Ваша позиция мне ясна. Давайте, не будем тратить время на бесполезный оффтоп?
Ок
3 окт 17, 13:18    [20838774]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg
Где пункт, что Excel сохраняет 5 млн ячеек 25 секунд?

У меня такого примера нет. Для чего указывать неэффективные алгоритмы?
Все указанные мною примеры вместе с сохранением (за исключением DOM, не стал ждать).
Все тестировалось в одинаковых условиях, в ячейки вносилось одно и то же число, файл изначально был пустой.
3 окт 17, 13:36    [20838846]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy,

Отработало за 7 секунд:
        static void Main()
        {
            var sw = Stopwatch.StartNew();

            using (SpreadsheetDocument xl =
                SpreadsheetDocument.Create("LargeFile.xlsx", SpreadsheetDocumentType.Workbook))
            {
                List<OpenXmlAttribute> oxa;
                OpenXmlWriter oxw;

                xl.AddWorkbookPart();
                WorksheetPart wsp = xl.WorkbookPart.AddNewPart<WorksheetPart>();

                oxw = OpenXmlWriter.Create(wsp);
                oxw.WriteStartElement(new Worksheet());
                oxw.WriteStartElement(new SheetData());

                for (int i = 1; i <= 50000; ++i)
                {
                    oxa = new List<OpenXmlAttribute>();
                    // this is the row index
                    oxa.Add(new OpenXmlAttribute("r", null, i.ToString()));

                    oxw.WriteStartElement(new Row(), oxa);

                    for (int j = 1; j <= 100; ++j)
                    {
                        oxa = new List<OpenXmlAttribute>();
                        // this is the data type ("t"), with CellValues.String ("str")
                        oxa.Add(new OpenXmlAttribute("t", null, "str"));

                        // it's suggested you also have the cell reference, but
                        // you'll have to calculate the correct cell reference yourself.
                        // Here's an example:
                        //oxa.Add(new OpenXmlAttribute("r", null, "A1"));

                        oxw.WriteStartElement(new Cell(), oxa);

                        oxw.WriteElement(new CellValue(string.Format("R{0}C{1}", i, j)));

                        // this is for Cell
                        oxw.WriteEndElement();
                    }

                    // this is for Row
                    oxw.WriteEndElement();
                }

                // this is for SheetData
                oxw.WriteEndElement();
                // this is for Worksheet
                oxw.WriteEndElement();
                oxw.Close();

                oxw = OpenXmlWriter.Create(xl.WorkbookPart);
                oxw.WriteStartElement(new Workbook());
                oxw.WriteStartElement(new Sheets());

                // you can use object initialisers like this only when the properties
                // are actual properties. SDK classes sometimes have property-like properties
                // but are actually classes. For example, the Cell class has the CellValue
                // "property" but is actually a child class internally.
                // If the properties correspond to actual XML attributes, then you're fine.
                oxw.WriteElement(new Sheet()
                {
                    Name = "Sheet1",
                    SheetId = 1,
                    Id = xl.WorkbookPart.GetIdOfPart(wsp)
                });

                // this is for Sheets
                oxw.WriteEndElement();
                // this is for Workbook
                oxw.WriteEndElement();
                oxw.Close();

                xl.Close();
            }

            sw.Stop();
            Console.WriteLine(sw.Elapsed);
            Console.ReadLine();
        }
3 окт 17, 14:28    [20839086]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
После этого:
                        //oxw.WriteElement(new CellValue(string.Format("R{0}C{1}", i, j)));
                        oxw.WriteElement(new CellValue("111"));
Отработало за 4.5 сек
3 окт 17, 14:30    [20839093]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
iMrTidy
Member

Откуда:
Сообщений: 568
refreg,

А вот это уже интересно, а сколько у Вас занимает вставка через Excel: 20837010
3 окт 17, 17:53    [20839875]     Ответить | Цитировать Сообщить модератору
 Re: Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel  [new]
refreg
Member

Откуда: Саратов
Сообщений: 726
iMrTidy
refreg,

А вот это уже интересно, а сколько у Вас занимает вставка через Excel: 20837010
4765 ms
3 окт 17, 20:43    [20840182]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить