Aerospike插入1000万个键值的时间过长



Aerospike插入1000万个键值几乎需要70分钟。我按照以下步骤插入:

  1. 我在内存中有所有密钥值

  2. 在Aeropike服务器上注册Aeropike udf

  3. 开始为java代码迭代1000万次,并为每个键和值调用aerospike udf模块。

  4. 在udf内部,我正在检查密钥是否已经存在。如果是,则更新,否则插入。

  5. 我有2个复制因子为2的Aeropike服务器。

是否有任何方法可以提高写入性能或执行批处理写入。我知道Aeropike不支持批量写入。对优化写入操作的任何建议。

我使用的代码

private void put(String namespace, String setName, String binName, String keyVlaue, List<Integer> listIdsToBeAdd, List<Integer> listIdToBeRemoved) {
    Key key = new Key(namespace, setName, keyVlaue);
    getAerospikeClient().execute(writePolicy, key, "aerospike_udf", "update_record", Value.get(listIdsToBeAdd), Value.get(listIdToBeRemoved), Value.get(binName));
}

UDF模块

function update_record( record, list1, list2, bin_name) 
  local store_list = record[bin_name]
  -- get a list from database record. Create one if it doesn't exits
  if store_list == nil then
    store_list = map()
  end
  if list2 then
    for i=1, #list2 do
      map.remove(store_list, list2[i])
    end
  end
  if list1 then
    for i=1, #list1 do
      store_list[list1[i]] = 1
    end
  end
  if map.size(store_list) == 0 then
    record[bin_name] = nil
  else
    record[bin_name] = store_list
  end
  if not aerospike:exists(record) then
    aerospike:create(record)
  else
    aerospike:update(record)
  end 
end

我开始使用Async Aerospike客户端,而不是使用sync Aerospike客户机执行。现在我可以在2.6分钟内插入1000万条记录。

最新更新