0

このような古い構造体クラスがtypedef vector<vector<string>> VARTYPE_T;あります。これは単一の変数として機能します。この変数は、リストの 1 つの値からテーブルのようなデータまで保持できます。座標 (x,y,z) のほとんどの値は、long、double、string、または double [3] です。必要に応じて変換するだけです。変数は、次のようなマップで管理されますmap<string,VARTYPE_T *>。文字列は変数名を保持します。確かに、それらはクラスにラップされています。また、ノードのツリーがあり、各ノードはこれらの変数マップの 1 つを保持できます。

これにVS 2008 SP1を使用すると、多くのメモリの断片化が検出されます。stlport を確認すると、stlport の方が高速 (20%) で、メモリ使用量が少ない (私のテスト ケースでは 30%) ようです。

質問は次のとおりです。適切に使用された高速メモリでこの要件を解決するための最良の実装は何ですか? プール アロケーターのような独自のアロケーターを作成する必要があります。これをどうしますか?

前もって感謝します、

ハウィー

4

1 に答える 1

0

に変更typedef vector<vector<string>> VARTYPE_T;してtypedef deque<deque<string>> VARTYPE_T;、メモリの断片化がまだあるかどうかを確認します。

ところで、VS 2008 SP1 でどのように測定しますか?

更新: HP が HP-UX メモリの断片化を処理する方法を知っています。いくつかの検索を行った後、興味深いリンクLow-fragmentation Heapを見つけました。これは引用です: The low-fragmentation heap (LFH) helps to reduce heap fragmentation. HP のメモリ断片化へのアプローチに似ているため、もちろんその説明から判断すると、私にとっては興味深いものです。(dequeを使用する以外に)試して確認することも良い考えだと思います。`

更新 2: 1) 速度。あなたはこれまでスピードについて何も語っていなかったので、良いアドバイスをするためのガイダンスはありません。また、実行中にプログラムがほとんどの時間を費やしている場所もわかりません。

主に文字列を long と double に変換するのに時間がかかると思われる場合は、この変換を 1 回だけ実行し、変数の値にアクセスするときにそれを使用する必要があります。おそらく、文字列ではなく実際の値を格納することをお勧めします。たとえば、ユニオンまたは Boost.Variant で。変数に値にすばやくアクセスできるインデックスがないと思われる場合は、これらのインデックスを追加する必要があります。

2) メモリ使用量。実際に何日も実行するサーバー アプリケーションを作成していて、そのメモリ消費量を気にする必要がありますか? 次にLow-fragmentation Heap、Windows で使用し、16K 未満のブロック サイズを使用するようにします。また、メモリ リークを取り除きます。もちろんチェックしますが、私が理解している限り、Low-fragmentation Heapニュースを処理する必要があります。

3) サーバー アプリケーションを作成する場合、 std::vector は適切な選択ではない場合があります。1 つのブロックにメモリを割り当てます。16K を超えると、メモリの断片化が発生する可能性があります。

4) 最後に、メモリ割り当てに関する HP-UX からの適切なレポートがどのように見えるかを見てください (メモリの断片化を見つけるため)。

Actual Heap Usage:
    Heap Start  =   0x60000000000fea38
    Heap End    =   0x6000000026580000
    Heap Size   =   642258376 bytes

Outstanding Allocations:
    251948524 bytes allocated in 4239425 blocks
                              Detailed Report

-------------------------------------------------------------------------
65343264 bytes in 1361318 blocks (25.94% of all bytes allocated)
These range in size from 48 to 48 bytes and are allocated
#0  stlp_std::__malloc_alloc::allocate(unsigned long&)   from ./libstlport.so.5.1
#1  boost::multi_index::detail::ordered_index<boost::multi_index::identity<csubs::clnt_tax_hist_t>, stlp_std::less<csubs::clnt_tax_hist_t>, boost::multi_index::detail::nth_layer<1, csubs::clnt_tax_hist_t, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<csubs::clnt_tax_hist_t>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, hrs_allocator::counting_allocator<csubs::clnt_tax_hist_t, (hrs_allocator::allocator_enums)9> >, boost::mpl::vector0<mpl_::na>, boost::multi_index::detail::ordered_non_unique_tag>::insert(csubs::clnt_tax_hist_t const&)   at _alloc.h:381



-------------------------------------------------------------------------
47510512 bytes in 848402 blocks (18.86% of all bytes allocated)
These range in size from 56 to 56 bytes and are allocated
#0  stlp_std::__malloc_alloc::allocate(unsigned long&)   from ./libstlport.so.5.1
#1  csubs::cache_impl<csubs::subs_data_t, csubs::search_policy_range<false>, csubs::erase_policy_range, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5>, boost::multi_index::multi_index_container<csubs::subs_data_t, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<csubs::subs_data_t>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5> > >::put(csubs::subs_data_t const&)   at _alloc.h:381
#2  csubs::db_cache_loader<csubs::cache_impl<csubs::subs_data_t, csubs::search_policy_range<false>, csubs::erase_policy_range, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5>, boost::multi_index::multi_index_container<csubs::subs_data_t, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<csubs::subs_data_t>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5> > >, csubs::ctrl_loader_nocheck>::operation()   at cache_subs_loaders.h:121
#3  csubs::group_subs_cache::load_caches_from_db(db_date const&, csubs::cache_options const&, otl_connect&, csubs::cache_stat*)   at ./caches/cache_subs_caches.cpp:1452

等々。

于 2010-03-09T07:36:02.090 に答える