powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
24 сообщений из 24, страница 1 из 1
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529255
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

SAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529275
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

оптимизации. если взять библиотеку для работы с Excel — Aspose Cells , она работает ещё быстрее, чем Excel, и вообще быстрее ничего я ещё не видел. но она платная, конечно :)
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529371
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aspose Cells,

Неужели можно наоптимизировать тот же SAX, что будет работать в 100 раз быстрее? Мне кажется, что речь идет о каком-то кардинально другом подходе, которым Майкрософт не захотел делиться, открыв тем самым дверь для коммерческих вариантов.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529424
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidySAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?
не в парсере дело(хотя и в нём что-то можно отжать)), а в о внутреннем представлении документа, которое вовсе не DOM-дерево
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529435
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Сохраняется документ как набор зипованых XML файлов, т.е. в конечном счете и Excel сохраняет все как DOM-дерево, только в разы быстрее.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529438
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

я о внутреннем представлении собственно в Excel .
а внутреннее представление влияет на скорость XML сериализации-десериализации
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529449
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Тогда логично будет спросить, а почему они не сделали похожий подход в OpenXML?
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529454
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyЗдравствуйте!

SAX подход несколько быстрее, чем DOM, но все же не идет ни в какое сравнение с тем как быстро идет, например, вставка через сам Excel. Откуда берется такая разница?Неужели в сто? Где пруф? Где тестовый пример?
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529469
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregiMrTidyЗдравствуйте!

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

Вот пример , вместо Rand можно просто число, на рабочем компьютере заняло секунд 20, аналогичная операция в Excel менее секунды, это уже как минимум в 20 раз разница. Если DOM, то после 25 минут дело так и не дошло до конца.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529502
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyИзопропил,

Тогда логично будет спросить, а почему они не сделали похожий подход в OpenXML?
чтоб эксель всегда был быстрее наколенных приблуд ))
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529518
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyrefregпропущено...
Неужели в сто? Где пруф? Где тестовый пример?

Вот пример , вместо Rand можно просто число, на рабочем компьютере заняло секунд 20, аналогичная операция в Excel менее секунды, это уже как минимум в 20 раз разница. Если DOM, то после 25 минут дело так и не дошло до конца.Открыл Excel. Заполнил матрицу слчис 100*50000. Включил таймер. Нажал сохранить. Отключил таймер. 25 секунд.
В примере 18 секунд (на своем компе пример не проверял)
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529574
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

Кодом 6 секунд:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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



Из буфера обмена, такой же объем, почти мгновенно.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529590
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

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

Сверь размеры получаемых файлов.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529597
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

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

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

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

Что значит хак? Что такое емнип?
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529618
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyrefreg,

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

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

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

Что значит хак? Что такое емнип?Ну 20 к 6 - это уже не 100 к 1. Дальше не интересно. Ищи ошибки в своих тестах.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39529863
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

Вот уж не думаю, что Вам было интересно разобраться в проблеме изначально.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530005
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyrefreg,

Вот уж не думаю, что Вам было интересно разобраться в проблеме изначально.Почему же. Я же указал, в чем была проблема первого теста 20836800 . Досконально, с каждым придуманным тестом возиться нет желания. А библиотека хороша хотя бы тем, что не требует установленного офиса... Если наличие Excel для проекта некритично, выбирай что быстрей нравится.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530091
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. К сожалению, не могу поделиться кодом, но указанных ссылок должно быть достаточно, чтобы разобраться что к чему.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530116
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

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

iMrTidyВаша позиция мне ясна. Давайте, не будем тратить время на бесполезный оффтоп?Ок
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530129
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregГде пункт, что Excel сохраняет 5 млн ячеек 25 секунд?
У меня такого примера нет. Для чего указывать неэффективные алгоритмы?
Все указанные мною примеры вместе с сохранением (за исключением DOM, не стал ждать).
Все тестировалось в одинаковых условиях, в ячейки вносилось одно и то же число, файл изначально был пустой.
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530179
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

Отработало за 7 секунд:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
        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();
        }
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530181
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После этого:
Код: c#
1.
2.
                        //oxw.WriteElement(new CellValue(string.Format("R{0}C{1}", i, j)));
                        oxw.WriteElement(new CellValue("111"));

Отработало за 4.5 сек
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530419
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

А вот это уже интересно, а сколько у Вас занимает вставка через Excel: 20837010
...
Рейтинг: 0 / 0
Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
    #39530487
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyrefreg,

А вот это уже интересно, а сколько у Вас занимает вставка через Excel: 20837010 4765 ms
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Операции чтения/записи через OpenXML SDK в сотни раз медленнее, чем через сам Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]