Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.09.29;
Скачать: [xml.tar.bz2];

Вниз

Проект "CachedBuffers"   Найти похожие ветки 

 
DevilDevil ©   (2013-03-11 19:59) [0]

CachedBuffers - это удобная и быстрая библиотека, предназначенная для задач потокового чтения/записи данных.

Предположим следующую ситуацию. Существует софт который генерирует очень большие объёмы данных, допустим 15млн ячеек, и сохраняет это всё в *.xlsx файл размером 100Мб. Ваши бухгалтера пытаются обрабатывать этот файл Excel-ем, но Excel жутко тормозит, и поэтому вам поручили разработать приложение, которое на вход будет принимать данный файл, обрабатывать своими алгоритмами, и на выходе выдавать какой-то результат. Благо *.xlsx файл это всего лишь Zip + набор Xml.

И здесь начинаются сложности. Даже не в распаковке Zip и не в парсинге Xml, а в объёмах. Zip-архив размером 100Мб, содержащий Xml файлы, вполне может распаковаться в 1Гб. И хранение/обработка всего этого в ОЗУ отрицательно сказывается на производительности, потому что бухгалтера работают на 4х пентиумах с 1Гб оперативы, и обновления парка машин ваш директор не планирует, потому что и на этих машинах Word, Excel и Outlook прекрасно работают. В таких задачах необходимо читать и обрабатывать данные кусками. Получится множественная последовательная обработка данных:
Обработка данных <-- XML в нужной кодировке <-- XML в исходной кодировке <-- Zip данные <-- Файл

Сложно производить преобразования, но не менее сложно производить менеджмент "кусков памяти". Поэтому я решил написать библиотечку, которая избавит меня от рутины менеджмента памяти и позволит напрямую удобно обращаться к ней, чтобы достичь хорошей производительности. Назвал я эту библиотечку "CachedBuffers": https://sourceforge.net/projects/cachedbuffers/

Интерфейс немного похож на TStream, но отличается производительностью и возможностью прямого доступа к буферной памяти. Отказался от классов в пользу object-ов потому что это благоприятно сказывается на производительности на уровне машинного кода.

Кстати библиотека содержит так же интерфейсы специально заточенные под чтение и запись файлов. Хочу поблагодарить людей, которые участвовали в тестировании нескольких утилит, с целью выявления оптимальных размеров буферов и набора атрибутов для файлов в операционной системе Windows: O"ShinW, Владислав, dmk, Jeer, DVM, Sapersky, Игорь Шевченко, megavoid, Inovet, Rouse_, Труп Васи Доброго, kipar, RenGD, Dronas, antonn, X11, Anton R, DimaBr.

Эту библиотеку я выкладываю по трём причинам:
1) Я сторонник позиции, что надо делать больше добрых дел. Это здорово пользоваться и делиться бесплатными библиотеками.
2) Лишний раз сообщить, что когда дойдут руки - буду заниматься проектом ApolloXML: http://delphimaster.net/view/15-1359703096/
По прежнему нет главного чувака, который писал бы утилиту и разобрался с XSD
3) Надеюсь библиотека пройдёт путь тестирования и оптимизации под x64, FPC, C++Builder, iOS, MacOS, Android, KOL, Linux. Поэтому если вы заинтересованы - вкладывайте силы в разработку

Спасибо за внимание


 
DevilDevil ©   (2013-03-11 20:07) [1]

* ApolloXML будет основываться на CachedBuffers


 
LivedLived   (2013-03-11 20:07) [2]

Удалено модератором
Примечание: Не в пивной...


 
DevilDevil ©   (2013-03-11 20:11) [3]

Удалено модератором


 
DevilDevil ©   (2013-03-11 20:12) [4]

да и не в Excel-е дело, если тут кто-то не понял ))))


 
Rouse_ ©   (2013-03-11 20:13) [5]


> DevilDevil ©   (11.03.13 20:07) [1]
> * ApolloXML будет основываться на CachedBuffers

О, ты решил нормальный быстрый парсер писать? Это дело здравое, всеми руками-ногами за, сам такое хотел делать (у нас как раз в некоторых местах просадка на парсинге XML), но начальство тормознуло когда прикинули объем времязатрат.
Только сразу пожелание - ты его сразу с поддержкой юникода делай, ибо со старыми известными мне парсерами проблема именно в этом была, слишком сложно все перекинуть на 2010 и выше.


 
LivedLived   (2013-03-11 20:19) [6]

Удалено модератором
Примечание: Не в пивной...


 
Rouse_ ©   (2013-03-11 20:22) [7]

А кстати еще один момент посоветую (по крайней мере я когда приступал к проектировании задачи смотрел именно в эту сторону).
Если ты сделаешь свой парсер с поддержкой стандартных интерфейсов IXMLDocument/IXMLNode etc то, с учетом что большинство использует именно данный штатный механизм, подключение парсера, с поддержкой уже готового принципа работы с данными, минимальная по трудоемкости задача.
Делается такая поддержка сом понимаешь тривиально, просто твои обьекты реализуют все методы данных интерфейсов и собственно все, а логика уже внутри.


 
DevilDevil ©   (2013-03-11 20:23) [8]

> Rouse_ ©   (11.03.13 20:13) [5]

розыч, возьми быстрые С++ SAX парсеры и запакуй в dll, потому что ещё неизвестно когда у меня руки дойдут, да и работать будет на основе XSD, да и завишу я от других людей, одному не потянуть проект.

могу посоветовать Expat
если файлы не очень большие, то может подойти PugiXML


 
Rouse_ ©   (2013-03-11 20:26) [9]


> DevilDevil ©   (11.03.13 20:23) [8]
> > Rouse_ ©   (11.03.13 20:13) [5]
>
> розыч, возьми быстрые С++ SAX парсеры и запакуй в dl

Да я решение то нашел - временное. Пока хватает, а вот на будущее... У тебя вроде слова с делом не расходятся, поэтому и советую :)


 
Jeer ©   (2013-03-11 20:27) [10]

Удалено модератором


 
DevilDevil ©   (2013-03-11 20:29) [11]

> Rouse_ ©   (11.03.13 20:22) [7]
> IXMLDocument/IXMLNode etc

во-первых, это DOM.
во-вторых, интерфейсы

т.е. в любом случае не подходит для задач обработки большого объёма данных с максимальной скоростью. Обычно используют SAX-парсеры. Это когда та запустил задачу на распарсивание, а тебе в калбек приходят распарсенные узлы и атрибуты - и ты уже с ними делаешь что хочешь. Потребление памяти минимальное, производительность стремится к максимуму. Но совсем не так удобно как в DOM.

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


 
Rouse_ ©   (2013-03-11 20:32) [12]


> DevilDevil ©   (11.03.13 20:29) [11]
> во-первых, это DOM.

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


 
DevilDevil ©   (2013-03-11 20:33) [13]

Удалено модератором


 
DevilDevil ©   (2013-03-11 20:33) [14]

Удалено модератором


 
Rouse_ ©   (2013-03-11 20:37) [15]

Удалено модератором


 
картман ©   (2013-03-11 20:38) [16]

"Но я же могу рассуждать о качестве омлета, хотя еще ни разу не снес ни одного яйца."(с)


 
Inovet ©   (2013-03-11 20:41) [17]

Удалено модератором


 
DevilDevil ©   (2013-03-11 20:43) [18]

Удалено модератором


 
Ega23 ©   (2013-03-11 20:45) [19]


> во-первых, это DOM.
> во-вторых, интерфейсы


С одной стороны - да. С другой - именно это и используется. Я не встречал кода, где метод XMLSave в качестве входного параметра использовал бы TXMLNode, везде IXMLNode.
Тут уже вопрос в той самой пресловутой целесообразности: либо меняем всё на стороннюю реализацию TXMLNode, либо жертвуем производительностью, но избегаем работы по переводу "сотни тонн" кода на новый лад (и, тем самым, избегаем кучи ошибок, которые обязательно появятся).


 
DevilDevil ©   (2013-03-11 20:47) [20]

> Ega23 ©   (11.03.13 20:45) [19]

открой для себя XML SAX
встретишь много нового


 
Rouse_ ©   (2013-03-11 20:54) [21]


> DevilDevil ©   (11.03.13 20:47) [20]
> > Ega23 ©   (11.03.13 20:45) [19]
>
> открой для себя XML SAX
> встретишь много нового

Ничего он не встретит, мы с ним проект по реализации XML парсера и прорабатывали и SAX по понятным причинам не подошел :)
Не злись на всех подряд :)


 
Rouse_ ©   (2013-03-11 20:57) [22]

ЗЫ: собственно именно под мою идеологию совместимости тебе Легыч и говорит.


 
Inovet ©   (2013-03-11 20:57) [23]

Удалено модератором


 
Rouse_ ©   (2013-03-11 21:01) [24]

Удалено модератором


 
Ega23 ©   (2013-03-11 21:34) [25]

Удалено модератором


 
Jeer ©   (2013-03-11 21:34) [26]

Удалено модератором


 
Германн ©   (2013-03-11 21:50) [27]

Удалено модератором


 
картман ©   (2013-03-11 22:06) [28]

Удалено модератором


 
Медвежонок Пятачок ©   (2013-03-11 22:11) [29]

т.е. в любом случае не подходит для задач обработки большого объёма данных с максимальной скоростью. Обычно используют SAX-парсеры. Это когда та запустил задачу на распарсивание, а тебе в калбек приходят распарсенные узлы и атрибуты - и ты уже с ними делаешь что хочешь. Потребление памяти минимальное, производительность стремится к максимуму. Но совсем не так удобно как в DOM.

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


А что насчет реальных (не тобой подсунутых) данных?
Например когда для правильной обработки какого-то узла требуется доступ к другим узлам от которых зависит интерпретация  текуще захваченного саксом узла?


 
Jeer ©   (2013-03-11 22:13) [30]

Удалено модератором


 
DevilDevil ©   (2013-03-11 22:30) [31]

> Например когда для правильной обработки какого-то узла требуется
> доступ к другим узлам от которых зависит интерпретация  текуще
> захваченного саксом узла?


у тебя есть какие-нибудь предположения на тему, зачем существуют SAX-парсеры если есть DOM ?


 
Игорь Шевченко ©   (2013-03-11 22:34) [32]

Запасаемся попкорном


 
Медвежонок Пятачок ©   (2013-03-11 22:45) [33]

у тебя есть какие-нибудь предположения на тему, зачем существуют SAX-парсеры если есть DOM ?

Вопрос не понял?
Тогда еще раз:

А что насчет реальных (не тобой подсунутых) данных?  .... и далее по тексту.


 
DevilDevil ©   (2013-03-11 22:49) [34]

> Медвежонок Пятачок ©   (11.03.13 22:45) [33]

а что будет если в мавзолей ленина засунуть сталина ?
я тоже не понимаю смысла твоего вопроса


 
Ega23 ©   (2013-03-11 22:52) [35]

Удалено модератором


 
Медвежонок Пятачок ©   (2013-03-11 22:54) [36]

"такой простой вопрос, а ставит вас в тупик"

Так что там насчет реальных данных-то?


 
DevilDevil ©   (2013-03-11 23:02) [37]

> Так что там насчет реальных данных-то?

а для каких данных я по твоему собираюсь разрабатывать быстрый парсер ?
для синтетических ?
он должен выдавать какой-то фейковый результат ?


 
Медвежонок Пятачок ©   (2013-03-11 23:09) [38]

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

как оно будет работать?
если узел item - иногда это лопаты, а иногда - дровосеки. причем в одном и том же документе.


 
DevilDevil ©   (2013-03-11 23:10) [39]

> Медвежонок Пятачок ©   (11.03.13 23:09) [38]

а как бы ты с такой задачей справился, используя SAX-парсер ?


 
Медвежонок Пятачок ©   (2013-03-11 23:13) [40]

а давай сначала ты ответишь, а потом уже твой вопрос рассмотрим?



Страницы: 1 2 3 4 5 вся ветка

Форум: "Прочее";
Текущий архив: 2013.09.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
2-1358182960
McLotos
2013-01-14 21:02
2013.09.29
сохранение из TStringList в переменную типа string


2-1358233902
Celtic
2013-01-15 11:11
2013.09.29
груповое изменение полей записей


8-1233162496
Agent[007]
2009-01-28 20:08
2013.09.29
Работа с Mesh, DirectX


15-1366453079
Фантазер
2013-04-20 14:17
2013.09.29
Ищу фант.рассказ


2-1358138194
yaproq
2013-01-14 08:36
2013.09.29
Помогите ускорить скорость перемещения "курсора".





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский