|
|
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Добрый день, пытаюсь создать большой XML файл, и вылезает соответствующая ошибка. Когда при формировании файла размер программы в памяти вырастает до 3.8ГБ, после этого программа падает(что логично). Итоговый файл при этом получается чуть более 400мб. TXMLDocument DOM Provider = Omnixml RAD Studio 10.3 Rio Примерно такой код: Код: pascal 1. 2. 3. 4. 5. 6. В реальности, код чуть более сложный (с подчинёнными узлами), тэгов добавляется около 20 и их название заметно длиннее. Получается совсем не понятное соотношение - файл 400мб, а в памяти = 3.8 гб. Учитывая, что имена тэгов в XML дублируются(открывающий и закрывающий), реально он должен занимать почти в 2 раза меньше памяти. Кто нибудь сталкивался с таким и можно ли это исправить ? Переходить на х64 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:14 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Можно воспользоваться SAX-парсером от MS.. И писать через него... Он входит в MSXML 6.0 Но тогда теряется кроссплатформенность... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:17 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Я, может, чего-то не знаю, но как парсер поможет при создании? По сабжу: кмк, тут только писать самостоятельно. Можно с привлечением движка, конечно - например, генерить N узлов, получать их XML текст и скидывать в файл - но склеивать куски воедино уже самому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:29 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B Кто нибудь сталкивался с таким Valery_B можно ли это исправить ? Valery_B Переходить на х64 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:37 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
X-Cite Можно воспользоваться SAX-парсером от MS.. И писать через него.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:55 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B, а зачем тебе DOM при создании? создавай построчно текстовый файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:58 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B Итоговый файл при этом получается чуть более 400мб. Сколько будут весить данные в csv/dbf? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 14:59 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B Итоговый файл при этом получается чуть более 400мб. А вообще, по моим наблюдениям, комфортный размер итогового XML 10-15 мегабайт. Так что я порекомендую разбить большой файл на кусочки Valery_B Получается совсем не понятное соотношение - файл 400мб, а в памяти = 3.8 гб. Учитывая, что имена тэгов в XML дублируются(открывающий и закрывающий), реально он должен занимать почти в 2 раза меньше памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 15:03 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
figli а зачем тебе DOM при создании? создавай построчно текстовый файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 15:04 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B Примерно такой код: Код: pascal 1. 2. 3. 4. 5. 6. В реальности, код чуть более сложный (с подчинёнными узлами), тэгов добавляется около 20 и их название заметно длиннее. Кто нибудь сталкивался с таким и можно ли это исправить ? Переходить на х64 ? Если текст ноды, выводимой для данной записи не зависит от других записей/нод, то итоговый XML можно представить так: <Шапка> <Табличная часть> <Подвал> соответственно, необходимо написать функцию RecordToXmlStr, которая для данной записи возвращает её XML текст. Тогда все будет примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. В RecordToXmlStr не забыть вставить конвертацию всяких '<','>','&' и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 15:38 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
X-Cite Можно воспользоваться SAX-парсером от MS.. И писать через него... Он входит в MSXML 6.0 Но тогда теряется кроссплатформенность... Не совсем понял что это. Как это сделать ? Можно пример на TXMLDocument.Create ? _Vasilisk_ Так что я порекомендую разбить большой файл на кусочки Ну, если бы у меня был выбор, тогда я бы это сделал вообще в Json _Vasilisk_ Пространство имен, список атрибутов, список детей, родитель... Родитель это ссылка в памяти в 4 байта, int32. Неймспейс - это часть имени в ноде. Формировать построчно нельзя, т.к. это будет решение конкретно этой задачи, а не универсальное решение. И там есть подчинённые узлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 17:18 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
И ещё заметил. Когда открываю файл 400МБ через TXMLDocument, он уже не есть столько памяти. И туда спокойно можно делать .AddChild ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 17:22 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B Неймспейс - это часть имени в ноде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 17:30 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
1. Сгенерить пустой документ в виде строк XML 2. Записать префикс (строки до первой записи, например, <?xml...?><Records>) 3. while not DS.EOF 3.1. serialize(DS.CurrentRecord, xmlDoc) 3.2. sNodeXML := xmlDoc['Records'].['Record'].XML 3.3. WriteFile(sNodeXML) 3.4. xmlDoc['Records'].ChildNodes.Clear 4. Записать постфикс (строки после записи, например, например, </Records>) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 17:30 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
или еще вариант - генерить по документу на каждую запись, опять же получать xml только основного узла и встраивать его в пишущийся файл. Сложнее, но можно распараллелить сериализацию и запись в файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 17:36 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2020, 18:15 |
|
||
|
Создать большой файл XML 400мб+ (ошибка out of memory)
|
|||
|---|---|---|---|
|
#18+
Valery_B, не нужен при создании файла DOM, раз ты данные линейным курсором получаешь, не надо себе проблемы выдумывать, он отжирает памяти в 10 раз больше данных. подчиненные ноды - сортируй датасет правильно и все в строки уложится, а если у тебя mssql - так просто оттуда готовый xml забери. кодировка и экранирование спецсимволов - это три строки кода. да, и по скорости и по памяти быстрее ничего не будет, и файл хоть в гигабайты создавай, собственно для этого и совет по собственному опыту. для мелочи можно почудить с dom, но как более-менее большие данные пойдут, то заснет все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2020, 13:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39936764&tid=2038496]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 266ms |
| total: | 390ms |

| 0 / 0 |
