Nano Hash - криптовалюты, майнинг, программирование

Использование глобальной переменной карты с коллекцией BaseX

Я использую BaseX (v9.3.2) XQuery v3.1. У меня есть сценарий XQuery, который оценивает все файлы XML в коллекции BaseX. В коллекции около 100 файлов, каждый размером от 30 МБ до 1,5 ГБ с одинаковой схемой XSD. Сценарий для повышения производительности использует Map Module BaseX для сопоставления ключей со значениями и быстрого получения значений с помощью ключ. Я объявил несколько глобальных переменных модуля типа map(*). Суть в том, что значения ключей уникальны только в одном файле XML. Чтобы сделать ключ уникальным для всей коллекции, я просто добавил base-uri($value),'_' в качестве дополнительной части ключа :). Это работает нормально. Основным недостатком, который я вижу, является необходимость туннелирования base-uri через все последовательные вызовы функций FooN($baseuri, $arg2) FooN-1($baseuri, $arg2) ... Foo1($baseuri, $arg2), даже если значение $baseuri установлено с первым вызовом FooN($baseuri, $arg2), но используется только в последней функции цепочки выполнения. Чтобы сделать это более понятным, см. код XQuery ниже. Здесь $basuri, наконец, нужен только в helper:Foo1, но нам нужно передать его в качестве аргумента и в helper:Foo2.

Мой вопрос в том, есть ли лучший подход к туннелированию аргументов и без других недостатков (производительность, память).

Код XQuery

xquery version "3.1" encoding "utf-8";

declare namespace helper="helperns";

declare variable $helper:root := db:open("BMW");

declare variable $helper:mapAS_ApplicationRecordElementByTypeRef as map(*) := map:merge(for $value in $helper:root//*:APPLICATION-RECORD-ELEMENT[*:TYPE-TREF/@DEST='APPLICATION-PRIMITIVE-DATA-TYPE'] return map:entry(concat(base-uri($value),'_',$value/*:TYPE-TREF/tokenize(text(),'/')[last()]), $value));
declare variable $helper:mapAS_ImplementationDataTypeRefByApplicationDatatypeRef as map(*) := ...


...

declare function helper:Foo1($applPrimitiveDataType as element(),$basuri as xs:string)
as element() {
  let $applRecordElement := map:get($helper:mapAS_ApplicationRecordElementByTypeRef, concat($basuri,'_',$applPrimitiveDataType/*:SHORT-NAME/text()))
...
  let $resolved := if($implDataTypeElement) then (
...
    )
    else (
      <RESOLVED_DATATYPE>
        <SHORT-NAME resolveinfo='not resolved (DB ERROR)'>unknown</SHORT-NAME>
      </RESOLVED_DATATYPE>  
    )
  return ($resolved)
};

...

declare function helper:Foo2($basuri as xs:string)
as element()* {
  let $applicationPrimitiveDataTypes := ...
  let $res :=
    for $applicationPrimitiveDataType in $applicationPrimitiveDataTypes
...
      order by $shortname
      return (
        if (not($implDataTypeRef)) then (
          let $dataTypeResolved := helper:Foo1($applicationPrimitiveDataType,$basuri)
          return(
            <MAPPING appldtname="{$shortname}" size="{$dataTypeResolved/*:SHORT-NAME/@size}" basedatatype="{$dataTypeResolved/*:SHORT-NAME}" resolveinfo="{$dataTypeResolved/SHORT-NAME/@resolveinfo}"/>
          )
        )
      )
  return($res)
};


let $mappingsForAllDocs :=
  for $doc in helper:getAllDocs()/doc
...
    let $missingmappings := helper:Foo2($doc/@baseuri)
    return (
      <FILE name="{$doc/@filename}" missing="{count($missingmappings)}">
        <MISSING-MAPPING>{$missingmappings}</MISSING-MAPPING>
...
      </FILE>
    )

let $allDocs :=
  for $doc in helper:getAllDocs()/doc
    order by $doc/@filename
    return (
      <FILE name="{$doc/@filename}"/>
    )

return($mappingsForAllDocs)
11.05.2020

Ответы:


1

Рассматривали ли вы возможность обновления XML-файлов (или создания нового набора) с помощью уникальных идентификаторов? При наличии уникальных идентификаторов базы данных XML, такие как BaseX, могут выполнять быстрый поиск с использованием функции fn:id(). Для обновления XML-файлов см. https://docs.basex.org/wiki/XQuery_Update.

17.05.2020
  • спасибо, это похоже на хороший практический подход, я изучу его. Я надеялся, что в XQuery есть синтаксическая поддержка, аналогичная функции туннеля с параметрами в XSLT v2. 17.05.2020
  • Я обновил коллекцию и сделал соответствующие /path//to/the/@ID уникальными: for $id in /path//to/the/@ID return replace value of node $id with concat(base-uri($id),'_',$id). Отмена тоже работает нормально: for $id in /path//to/the/@ID return replace value of node $id with replace($id,concat(base-uri($id),"_"),''). 18.05.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..