|
|
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, ALL. с xml раньше не работал. А тут понадобилось создать xml-файл. Нашел в интернете рабочий способ: Код: pascal 1. 2. 3. 4. 5. 6. end; with xml do begin with AddChild('primer') do ... [/SRC] Но все работает при небольшом объеме данных выгрузки. А при большом выбрасывает ошибку, что не хватает памяти. Типа 32-разрядное приложение не может занимать память больше 2 гигов. Слыхал, что есть другие способы создания xml-файлов, без хранения всего дерева. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 13:30:42 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
igor_prg, Google, "direct XML writer". Например, OmniXML пишет что в нём есть, но я лично им не пользовался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 13:54:58 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
самый быстрый и простой способ записи конкретного XML в файл - это просто запись текста в файл XML это обычный текст. Ничего не мешает его писать как обычный текст. TStreamWriter очень удобно подходит например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 13:58:07 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
2 alekcvp Спасибо. 2 krapotkin Я так в самом начале и сделал. Но если в тексте будут какие-то спецсимволы (типа "&"), то xml файл не пройдет валидность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 14:06:13 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
http://wiki.freepascal.org/XML_Tutorial/ru модули DOM и XMLWrite из freepascal могут быть использованы в delphi? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 14:43:13 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
Я давно агитирую местных, давайте напишем парсер и писатель XML на платформе CachedTexts. Аналогов по скорости не будет. Но желающих помогать нет, а без помощи я ещё фиг знает когда этим займусь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 15:29:23 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
igor_prgбудут какие-то спецсимволы ну так мы же сами пишем текст. сами и спецсимволы заменим их всего-то десяток ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 15:46:09 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
мой вариант преобразования текстовой строки в XML-строку с учетом спецсимволов: Код: pascal 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. и простейший пример прямой записи в XML-файл: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 19:58:42 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
вот и глюк форума, он не правильно отобразил часть исходников)))) имелось ввиду следующее: case ASource[I] of '<': Result := Result + '<'; '>': Result := Result + '>'; '"': Result := Result + '"'; '&': Result := Result + '&'; else // просто добавляем Result := Result + ASource [I]; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 20:01:02 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
емое, попробую еще раз: case ASource[I] of '<': Result := Result + '& l t ; ' ; '>': Result := Result + '& g t ; ' ; '"': Result := Result + '& q u o t ; ' ; '&': Result := Result + '& a m p ; ' ; else // просто добавляем Result := Result + ASource[I]; end; убрать пробелы, где выделено жирным шрифтом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 20:02:46 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
asutp2 и простейший пример прямой записи в XML-файл: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. а ты вообще топикстартера читал ? igor_prg А при большом выбрасывает ошибку, что не хватает памяти. Типа 32-разрядное приложение не может занимать память больше 2 гигов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 22:22:02 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
DimaBr конечно я читал топик ТС и прекрасно понимаю суть проблемы, т.к. сам с ней сталкивался на заре начала работы с XML-документами. А суть проста - TXmlDocument очень прожорлив к памяти и из за этого видимо очень тормознут. Записывая тот же самый документ через (например!) TStringList, мы используем памяти как минимум в 10 раз меньше. И чем разветвленнее документ (т.е. чем больше вложенности)), тем он больше жрет памяти при работе через TXmlDocument. Ну и никто не запрещает записывать результирующий файл кусками, а не собирать его в памяти. ТС направления для работы выданы, я считаю)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2017, 23:00:37 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
Знаю одну контору которая тоже очень любит xml как обычные текстовые файлы создавать. Проблема в том что потом эти текстовые файлы периодически не проходят проверку по xsd схеме :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 09:31:06 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
Мне понравился модуль (бесплатный) SimpleXML. Правда на большие объемы его не проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 09:39:17 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
любой компонент или библиотека нужны лишь для разбора структурированного хранения XML здесь эта задача вообще не стоит зачем тогда сверхдвижения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 10:33:56 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
эндиЗнаю одну контору которая тоже очень любит xml как обычные текстовые файлы создавать. Проблема в том что потом эти текстовые файлы периодически не проходят проверку по xsd схеме :)) Можно подумать, что при создании через DOM файлы будут гарантировано проходить проверку и валидация выполняется в момент создания xml-файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 10:36:03 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
igor_prg, Недавно обсуждали тут быструю запись XML Мой вариант оказался в 15 быстрее кода автора. И наверное раз в 50 быстрее решений, которые тебе здесь предлагают Можешь попытаться разобраться 20576292 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 13:10:46 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU твой код в 50 раз быстрее, чем простое заполнение tstringlist и запись в файл?))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 13:44:03 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
asutp2, да, это правда. Тут многие тестировали его код - так hdd просто взрывались: скорость записи в десятки раз превышает предельную скорость, на которую рассчитано оборудование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 14:03:46 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
чччД я скорость данной библиотеки не проверял, но исходники внимательно посмотрел. слабые места библиотеки: - использование приведений pointer() - кроссплатформенность не в почете? - использование label - сразу вспомнились времени turbo pascal 7.0 и delphi 1.0 для справедливости я соглашусь, что операции с текстовыми строками дорогие в плане тиков, поэтому работа с фиксированным буфером в памяти с периодическим скидыванием очередной сформированной части буфера в файл (используя кэширование) будет самым быстрым. проверим :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 14:17:31 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
writeln + settextbuf и не надо никакого стороннего кода. Быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 14:42:37 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЯ давно агитирую местных, давайте напишем парсер и писатель XML на платформе CachedTextsПоделиться своим парсером? Писал многопоточный читатель/писатель. Читатель поддерживает кучу кодировок, писатель пишет только в UTF-8. Не поддерживается запись комментариев и не поддерживаются пространства имен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 15:00:59 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Выложи в эту ветку, пожалуйста: http://www.sql.ru/forum/1204260/oficialnyy-reliz-biblioteki-cachedtexts Вообще наиболее эффективный формат такой разработки я представляю себе как "в четыре руки". То есть один запаривается над архитектурой и скоростью, второй определяет (уточняет) правила и проверяет корректность выполнения кода, может быть через юнит тесты. Подумай, может быть потянешь такой формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 18:43:43 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
asutp2 SOFT FOR YOU твой код в 50 раз быстрее, чем простое заполнение tstringlist и запись в файл?))) Разумеется. Вот здесь был тест на запись 100Мб: http://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers На 1Гб разница будет колоссальная, и то, TStringList сработает только на x64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 18:47:15 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
P.S. В тесте как раз разница в 50 раз относительно TStringList :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 18:50:38 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUP.S. В тесте как раз разница в 50 раз относительно TStringList :) TStringList люди-то для примера приводят. Никто в своём уме 1GB через TStringList перелопачивать не будет. Скорее всего люди просто сделают Stream.Write(buffer, buffer_size). И какое преимуществу даст твой магический способ записи перед этим методом? Можно ещё "подшаманить", чтобы в буфере было, к примеру, не менее 2048 байт в момент записи. Что там ещё за волшебные оптимизации могут быть, кроме как использование SSD? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 19:36:42 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUP.S. В тесте как раз разница в 50 раз относительно TStringList :) Да уж. Быстродействие впечатляет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 21:07:04 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
Твое у меня выполняется за 700-900 мс. А вот якобы быстрая XML писалка: Код: pascal 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. 84. 85. 86. 87. 88. 89. Причем дело не в записи на диск. Код: pascal 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. Неужели операции со строками настолько тормозные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 21:24:35 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
У автора проблема не в скорости, а в том, что XML-данные надо в потоке писать из-за их объема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 21:27:38 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
JaDi, Объем как раз и приводит к проблемам со скоростью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 21:33:26 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
rgreat А вот якобы быстрая XML писалка: Закопай обратно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 21:40:57 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
rgreat, Как показывает практика, скорость записи, если речь конечно о файлах до 100-300Мб, SSD и ОС начиная с Висты, упирается в такты, а не ожидание винта, потому что по сути запись идёт в ОЗУ, а на диск оно сбрасывается спустя время. И здесь важна оптимизация по регистрам, инлайны, не говоря уже о высоких материях типа конвертации, проверок, присвоение вместо Move, вызов дополнительных функций. Конкатенациях строк - это отдельная прожорливая штука. Потому, что надо выделить память в менеджере, скопировать, очистить. Всё это оборачивается try/finally и interlocked методами. Очень хорошо иллюстрируется разница в примере по CachedBuffers. Ручная низкоуровневая запись обходится в 109мск. А человеческая, "высокоуровневая", хоть и жутко оптимизированная - уже 265мск. То есть вопросы кеш-промахов и ожиданий диска, о чем любят говорить противники чрезмерной оптимизации, просто не играют сколько-нибудь значимой роли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 00:03:53 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, авторТо есть вопросы кеш-промахов и ожиданий диска, о чем любят говорить противники чрезмерной оптимизации, просто не играют сколько-нибудь значимой роли. До тех пор, пока размер данных не упрётся в кэш веника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 00:45:05 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
makhaon, Наверное, да. Но в этом случае разница по скорости будет уже не в 50 раз, а в 25. Что само по себе не мало ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 00:49:22 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
schirgreat А вот якобы быстрая XML писалка: Закопай обратно Откопай быструю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 01:14:40 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
schi, Дело хорошее, но, судя по тестам, работает в 5 раз медленнее возможного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 11:26:06 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
rgreatНеужели операции со строками настолько тормозные? > WriteToBuff(' '+Name+'="'+Value.ToString+'">'); Сложение строк и понятие "быстрый" в Delphi несовместимое понятие. Надо делать inline-функции типа WriteChar, WriteBuf и вызывать их по-очереди. Разумеется, при условии что в них не что-то вроде: "Buf := Buf + Text;". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 11:51:24 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUschi, Дело хорошее, но, судя по тестам, работает в 5 раз медленнее возможного Но что характерно, без ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 12:38:15 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
schi, Ну так и через CachedBuffers без ошибок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 12:53:41 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
alekcvp, alekcvpСложение строк и понятие "быстрый" в Delphi несовместимое понятие. в других языках, впрочем, тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 13:53:04 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
igor_prgСлыхал, что есть другие способы создания xml-файлов, без хранения всего дерева. Microsoft XML Lite например https://github.com/the-Arioch/Delphi-XmlLite/tree/master/Samples/DynArrays to-from files ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 14:27:28 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
igor_prgЯ так в самом начале и сделал. Но если в тексте будут какие-то спецсимволы (типа "&"), то xml файл не пройдет валидность для этого есть escaping-функции ( например в составе Jedi CodeLib ) но все равно останется вопрос с CDATA-блоками, сбалансированным открыванием-закрыванием тээгов и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 14:30:10 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
alekcvp"direct XML writer". Например, OmniXML пишет что в нём есть Возможно, имеет смысл попробовать OXml, но OmniXML... Функции direct XML writer я в нем не искал, а вот чтение монстрового XLSX файла пробовал (очень удачно прислали медвежуть, сформированную каким-то надмозгом). Сравнительно с банальным Microsoft XML v6 через TXMLDocument этот Omni жрал заметно больше памяти и заметно медленнее работал. Нет, для Дельфи он действительно весьма удбный и приятный для использования на малых и средних файлах, но рекорды по объёму/скорости я бы на нём ставить даже не пытался. Впрочем, я вообще в этом плане извращенец и маленькие XML файлы обычно лени ради читаю через JSON SuperObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 14:34:40 |
|
||
|
Создание xml
|
|||
|---|---|---|---|
|
#18+
rgreatSOFT FOR YOUP.S. В тесте как раз разница в 50 раз относительно TStringList :) Да уж. Быстродействие впечатляет. TStringList - сам по себе очень медленный и жадный до памяти класс. В нём слишком много свисков и перделок на каждый чих. Если уж хочется скорости и объёмов, то надо вместо него использовать TList<string> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 14:35:50 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2042063]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
201ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 517ms |

| 0 / 0 |
