非常に大きな EMF モデル (ヒープで 1G を超える) を XML ファイルにシリアル化する場合、数時間かかるという次の問題があります。その長い遅延の原因となる何か間違ったことをしているのか、それともこれほど長い時間がかかるのが一般的なのか、私にはわかりません。モデルには多くのリストがありますが、それ以外の場合は、非常に長い UUID を持つグラフ ノードであるオブジェクトと、ほとんどが整数であり、さらに名前などの文字列値であるいくつかのパラメーターがあるだけのオブジェクトがたくさんあります。
これは、EMF モデルの保存ルーチンの抜粋です。
// Register the XMI resource factory
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
reg.getExtensionToFactoryMap().put(uri.fileExtension(), new XMIResourceFactoryImpl());
// Obtain a new resource set
ResourceSet resSet = new ResourceSetImpl();
// create a resource
Resource resource = resSet.createResource(uri);
// get resource content
EList<EObject> resourceContent = resource.getContents();
resourceContent.add(objectsToAdd);
// save to file
resource.save(ResourceAdder.createOptions());
それが私のオプションがどのように見えるかです:
public static Map<?, ?> createOptions() {
HashMap<String, Object> options = new HashMap<String, Object>();
options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
options.put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE);
options.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
return options;
}
だから私の質問は、大きなEMFモデルをシリアライズするのにそれほど時間がかかるのが一般的かどうかです? モデルのシリアル化にかかる時間を短縮するために何ができると思いますか? 私はすでに Teneo を使用することを検討し、EMF モデル全体をローカルの Derby データベースにシリアライズしましたが、ランタイムが改善されるかどうかはまだテストしていません。あなたが提供できる指針や提案をありがとう。
VisualVM による非常に小さなグラフからのヒープ分析を追加しましたが、シリアル化にはまだ数分かかりました。すべての XML ファイルの最終的なサイズは 250MB です。