Удалите около 60 000 XML узлов из огромного файла 3 ГБ XML - Powershell - PullRequest
1 голос
/ 22 апреля 2020

В настоящее время я пытаюсь удалить большой объем данных из огромного файла XML. В настоящее время я использую Powershell, чтобы попытаться сделать это, и мне было интересно, если это вообще возможно сделать это в приемлемое количество времени. Этот файл содержит 2,5 млн записей, и я хочу удалить все записи, где атрибут = «КОМПАНИЯ». Вот мой текущий код:

$xml = [xml]'' 
$xml.Load("C:\New folder\untrimmed.xml")


$node = $xml.SelectSingleNode("//record[@category='COMPANY']")
while ($node -ne $null) {
    $node.ParentNode.RemoveChild($node)
    $node = $xml.SelectSingleNode("//record[@category='COMPANY']")

$xml.save("C:\New folder\trimmed.xml")

После того, как это выполнено через полтора часа, урезанный файл становится БОЛЬШЕ по размеру, чем оригинал. Как я могу сделать это лучше? PowerShell не является подходящим инструментом для работы здесь?

1 Ответ

0 голосов
/ 22 апреля 2020

Попробуйте новый инструмент Gizmo в Saxon 10.0.

java net.sf.saxon.Gizmo -s:"C:\New folder\untrimmed.xml"
/>delete //record[@category='COMPANY']
/>save C:\New folder\untrimmed.xml
/>quit

Предостережение: я не пробовал его с именами файлов, содержащими пробелы.

К сожалению, в настоящее время Gizmo не использует потоковую передачу (у нас был прототип, но он не выпущен) , так что для этого вам понадобится немало памяти.

Если потоковая передача необходима, вы можете сделать это с помощью таблицы стилей потоковой передачи XSLT 3.0:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
               version="3.0">
  <xsl:mode streamable="yes" on-no-match="shallow-copy"/>
  <xsl:template match="record[@category='COMPANY']"/>
</xsl:transform>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...