4

次のコードがあります。

public XsdValidator(Resource... xsds) {
    Preconditions.checkArgument(xsds != null);
    try {
      this.xsds = ImmutableList.copyOf(xsds);
      SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
      LOGGER.debug("Schema factory created: {}",schemaFactory);
      StreamSource[] streamSources = streamSourcesOf(xsds);
      LOGGER.debug("StreamSource[] created: {}",streamSources);
      Schema schema = schemaFactory.newSchema(streamSources);
      LOGGER.debug("Schema created: {}",schema);
      validator = schema.newValidator();
      LOGGER.debug("Validator created: {}",validator);
    } catch ( Exception e ) {
      throw new IllegalArgumentException("Can't build XsdValidator",e);
    }
  }

XSD ファイルに対してこの行schemaFactory.newSchema(streamSources);を実行するには、非常に長い時間 (30 秒) かかるようです。

この XSD で多くのテストを行った結果、次のことが原因のようです。

  <xs:complexType name="entriesType">
    <xs:sequence>
      <xs:element type="prov:entryType" name="entry" minOccurs="0" maxOccurs="10000" />
    </xs:sequence>
  </xs:complexType>

問題はmaxOccurs="10000"

maxOccurs="1"またはを使用maxOccurs="unbounded"すると、非常に高速です。

誰かが使用の問題を教えてもらえますかmaxOccurs="10000"?

4

1 に答える 1

4

私の個人的な経験に基づくと、一部の人が「不当に」高い値と見なす可能性のある値によってパーティクルが境界付けられていると、パフォーマンスの問題が発生します (このリンクは私のブラウザーのお気に入りからのものです)。

根本的な原因は、(maxOccurs 値によって示される効果への) メモリ割り当てのようです。

また、すべての意図と目的のために、XSD の内容に関係なく、パーサーが maxOccurs を実際に無制限として処理するしきい値を述べていたドキュメント項目を思い出します (見つけたら、この投稿を再訪します)。 .

于 2013-10-26T13:54:47.793 に答える