0

以下のコードでヒープスペースエラーが発生しています。

誰もがこのコードを最適化する方法を知っています。

これは大きなファイル[180MB]で発生します。メソッドパラメータには、各ロケールに対応する約50のメタタグキー値があります。エラーは、4500ページを処理した後に表示されます。

注:スペースを解放するためにiterator.remove()を使用するように、foreach iteratorに変更してみました。

public static String myChildPropsToString(final UnicodeProperties myLayoutProps) {       
    final StringBuilder sb = new StringBuilder(myLayoutProps.size());

    final String[] matchTarget = new String[] { StringPool.RETURN_NEW_LINE, StringPool.NEW_LINE, StringPool.RETURN };
    final String[] replaceTargetBy = new String[] { "_SAFE_NEWLINE_CHARACTER_", "_SAFE_NEWLINE_CHARACTER_",
            "_SAFE_NEWLINE_CHARACTER_" };

     //COMMENTED TO TRY OUT ITERATOR.REMOVE
    //
    // for (final Map.Entry<String, String> entry : myLayoutProps.entrySet()) {
    // final String value = entry.getValue();
    //
    // if (Validator.isNotNull(value)) {
    // StringUtil.replace(value, matchTarget, replaceTargetBy);
    //
    // sb.append(entry.getKey());
    // sb.append(StringPool.EQUAL);
    // sb.append(value);
    // sb.append(StringPool.NEW_LINE);
    // }
    // }

    final Iterator<Entry<String, String>> propsIterator = myLayoutProps.entrySet().iterator();
    while (propsIterator.hasNext()) {
        final Entry<String, String> entry = propsIterator.next();

        if (Validator.isNotNull(entry.getValue())) {
            StringUtil.replace(entry.getValue(), matchTarget, replaceTargetBy);

            sb.append(entry.getKey());
            sb.append(StringPool.EQUAL);
            sb.append(entry.getValue());
            sb.append(StringPool.NEW_LINE);
        }
    }
    propsIterator.remove();

    return sb.toString();
}

私のコードから、これを次のように親プロパティobjに設定しています:

UnicodeProperties myParentProps = new UnicodeProperties();
//Set some values to parent
UnicodeProperties myLayoutProps = new UnicodeProperties();
//Set some values to child
....
myParentProps.setProperty("childProp",myChildPropsToString(myLayoutProps));

どんな助けでも深く感謝します!

4

1 に答える 1

0

propsIterator.remove();を配置してみてください。しばらくの間。

final Iterator<Entry<String, String>> propsIterator = myLayoutProps.entrySet().iterator();
    while (propsIterator.hasNext()) {
        final Entry<String, String> entry = propsIterator.next();

        if (Validator.isNotNull(entry.getValue())) {
            StringUtil.replace(entry.getValue(), matchTarget, replaceTargetBy);

            sb.append(entry.getKey());
            sb.append(StringPool.EQUAL);
            sb.append(entry.getValue());
            sb.append(StringPool.NEW_LINE);
        }
        propsIterator.remove();
    }
于 2012-11-16T17:42:30.207 に答える