2017-07-06 108 views
1

除了使用IDataStreamerIBinaryObject來減少在Apache Ignite.NET中的插入時間之外,還可以做些什麼其他事情?是否有可能獲得顯着的性能提升,或者達到這個效果?Apache Ignite:如何提高插入性能?

我使用:

  • .NET
  • 41個查詢字段:1個字符串字段和每行40個浮點字段
  • IBinaryObject/WithKeepBinary
  • IDataStreamer
  • 默認JVM設置
  • 分區緩存
  • 沒有持久性

我用這個例子作爲一個起點: https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Datagrid/DataStreamerExample.cs

這裏是我的IDataStreamer的用法:

using (var ds = m_ignite.GetDataStreamer<string, IBinaryObject>(CacheName)) { 
    foreach (var binaryRow in rows.Select(r => BuildRow(r))) { 
     var key = binaryRow.GetField<string>(PrimaryKeyName); 
     ds.AddData(key, binaryRow); 
    } 
} 

性能測試結果:(5個節點都具有相同的規格)

BenchmarkDotNet=v0.10.8, OS=Windows 8.1 (6.3.9600) 
Processor=Intel Xeon CPU E5-2698 v4 2.20GHz Intel Xeon CPU E5-2698 v4 2.20GHz, ProcessorCount=4 
Frequency=14318180 Hz, Resolution=69.8413 ns, Timer=HPET 
    [Host]  : Clr 4.0.30319.42000, 64bit RyuJIT-v4.7.2053.0 
    Job-UZDKMF : Clr 4.0.30319.42000, 64bit RyuJIT-v4.7.2053.0 

RunStrategy=Monitoring TargetCount=1 

NumRows  Mean (ms)  Per Row (ms/row) 
10   359.50*  35.95* 
100   465.50*  4.66* 
1,000  797.80*  0.80* 
10,000  4,479.80  0.45 
100,000  37,611.60  0.38 
500,000  184,640.00  0.37 
1,000,000 366,801.40  0.37 
2,000,000 732,562.40  0.37 
4,000,000 1,458,913.60 0.36 

*Measurement is larger because it also measures some lightweight work before inserting the rows 

任何提示,提示或文檔離子是讚賞。謝謝!

回答

2
  1. 不要叫getfield命令檢索鍵,直接從BuildRow返回它(即返回KeyValuePair<string, IBinaryObject>

  2. Parallelise插入(和BuildRow電話):

    Parallel.ForEach(rows, r => 
    { 
        KeyValuePair<string, IBinaryObject> pair = BuildRow(r); 
        ds.AddData(pair); 
    }); 
    
  3. 運行更點燃更多機器上的節點

  4. 如果行來自外部數據源,則可以使每個Ignite節點只加載相關部分。你可以做到這一點通過ICompute.Broadcast每一行執行DataStreamer,並在遍歷行,檢查密鑰屬於當前節點:

    IAffinity aff = m_ignite.GetAffinity(cacheName); 
    IClusterNode localNode = m_ignite.GetCluster().GetLocalNode(); 
    Parallel.ForEach(rows, r => 
    { 
        string key = GetKey(r); 
        if (aff.IsPrimary(localNode, key)) 
        { 
         KeyValuePair<string, IBinaryObject> pair = BuildRow(r); 
         ds.AddData(pair); 
        } 
    }); 
    
+0

感謝@ptupitsyn。通過做1,2和3,它減少了14.6%的加載時間。上面我的性能指標中最多的時間是由於某些序列化將原始數據轉換爲列,我將嘗試在StreamReceiver中進行處理,而不是在前期處理。 – Charlie