0

プライベートクラウド内の仮想マシンの使用記録の大規模なデータセットがあります。この一連のレコードは、1時間ごとに、クラウドで実行されているすべてのVMに対して生成されます。すべてのVMには、RAM、メモリなどの仕様を含むレコードがあり、使用状況レコードのvirtualmachineidに対応するid:フィールドがあります。APIをクエリして、XMLまたはJSONデータセットを取り戻すことができます。JSONを選択したのは、ネットワーク上ではるかに軽量だからです。

これは1つのレコードであり、ディスク使用量、帯域幅、実行時間などに対応する13種類の使用法があります。

Usage Record:                                                                    
  { account: 'user_1',                                                           
    accountid: 'c22ed7ed-e51a-4782-83a7-c72e2883eb99',                             
    domainid: 'f88d8bbf-a83b-4be1-a788-e2ab51eb9973',                              
    zoneid: '4a7f62a8-3248-47ee-bf94-d63dac2a6668',                                
    description: 'VM2 running time (ServiceOffering: 11) (Template: 215)',         
    usage: '1 Hrs',                                                                
    usagetype: 1,                                                                  
    rawusage: '1',                                                                 
    virtualmachineid: 'f6661f34-4d03-4128-b738-38c330f2499c',                      
    name: 'VM2',                                                                   
    offeringid: 'f1d82c2e-25e3-4c97-bae8-b6f916860faf',                            
    templateid: '2bf2e295-fdd6-4326-a652-6d07581be070',                            
    usageid: 'f6661f34-4d03-4128-b738-38c330f2499c',                               
    type: 'XenServer',                                                             
    startdate: '2012-12-25\'T\'22:00:00-06:00',                                    
    enddate: '2012-12-25\'T\'22:59:59-06:00' } 

私がやろうとしていること:

数百のVMのリストを移動し、VMごとに、前の期間(通常は1か月)の使用状況レポートを作成する必要がありますが、アドホックにすることもできます。したがって、毎月の各VMの10000以上の使用記録から、各使用タイプの合計を計算する必要があります。

従来のloop-loop-loop、次にloop-againの方法よりも効率的で斬新な方法はありますか?擬似コードの場合:

for (each vm in vms)
    for (each usage_record in usage_records)
        if (vm.id === usage_record.vmid)
            switch usage_record.usage_type
                case 1: its runtime
                case 2: its disk usage
                case 3: its some other type of usage
                ...

アンダースコアを使用して、これまでに行ったことは次のとおりです。

_.each(virtualMachines.virtualmachine, function (vm) {   
    var recs = _.filter(usageList.usagerecord, function (foo) { 
        return (foo.virtualmachineid === vm.id && foo.usagetype === 1); 
    });
        console.log("recs count:" + recs.count); 
        //now, recs contains all the usage record type 1 for one VM  

 });                                                          

これは現在は正常に機能していますが、最適化されているとは確信しておらず、VM数が増えるにつれて拡張されません。VMごとに、10,000の追加の使用状況レコードがデータセットに追加されます。

4

1 に答える 1

3

各VMを処理する必要があり、VMごと結果が必要なため、最初にVMごとにリストを並べ替えます。その後は、「現在のVM統計」に対して1つのループと1つのオブジェクトのみが必要になります。リスト内の次のVMに遭遇すると、現在の統計が完了していることがわかります。

sortRecordsByVM();
currentStats = { runtime: 0, disk: 0, other: 0 };
currentVM;
for each record
  if currentVM != record.VM
    writeToOutput(currenStats);
    currentStats = { runtime: 0, disk: 0, other: 0 };
  addRecordTo(record, currentStats);
writeToOutput(currenStats);

つまり、10Kを超えるレコードを繰り返すことで最新のマシンに問題が発生することはないと思うので、可能な限り単純なアプローチから始めて、パフォーマンスの問題がある場合にのみ最適化します。

ネストされたループを使用せず、ルックアップを組み込みのデータ構造(通常、最初に作成する傾向のあるどのコードよりも最適化されている)に任せます。

allStats = {};
for each record
  stats = allStats[record.VM];
  if (!stats)
    stats = { runtime: 0, disk: 0, other: 0 };
  addRecordTo(record, stats);
  allStats[record.VM] = stats;
于 2013-01-09T13:22:41.723 に答える