arangodb truncate在大型集合上失败

arangodb truncate在大型集合上失败,arangodb,Arangodb,我在arangosh中得到一个超时,如果我试图截断一个大约4000万文档的大集合,arangodb服务就会失去响应。信息: arangosh[database_xxx]>db.[collection_yyy].truncate();文件'/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js'中的JavaScript异常位于104,13:[ArangoError 2001:读取时出错:'tcp://127.0.0.1:8529

我在arangosh中得到一个超时,如果我试图截断一个大约4000万文档的大集合,arangodb服务就会失去响应。信息:

arangosh[database_xxx]>db.[collection_yyy].truncate();文件'/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js'中的JavaScript异常位于104,13:[ArangoError 2001:读取时出错:'tcp://127.0.0.1:8529“”读取过程中超时']! 抛出新ArangoError(requestResult);!^stacktrace:错误 在Object.exports.checkRequestResult(/usr/share/arangodb/js/client/modules/org/arangodb/arangosh.js:104:13) 在ArangoCollection.truncate(/usr/share/arangodb/js/client/modules/org/arangodb/arango collection.js:468:12) 时间:1:11

Debian Jessie上的ArangoDB 2.6.9,AWS ec2 m4.xlarge,16G RAM,SSD。 服务没有响应。我怀疑它被卡住了(不仅仅是忙),因为它在我停止后才工作,在/var/lib/arangodb/databases/中删除数据库,然后重新开始

我知道,由于规模的原因,我可能会倾向于性能的极限,但我想,无论规模大小,我都不会失败

然而,在非云的Windows10、16GB RAM、SSD上,同样的操作成功了——过了一段时间

是虫子吗?我有一些python代码,如果有帮助的话,可以将虚拟数据加载到集合中。如果我需要提供更多信息,请告诉我。 摆弄--server.request-timeout会有帮助吗

提前谢谢 Søren

增加
--server。ArangoShell的请求超时将只增加shell在关闭空闲连接之前将使用的超时。
arangod服务器还将关闭延迟的keep alive连接,这可能会更早发生。这是通过服务器的
--server.keep-alive timeout
设置控制的

然而,增加这两个数字并没有多大帮助。实际问题似乎是
truncate()
操作本身。是的,它可能非常昂贵
truncate()
是一个事务性操作,因此它会将删除的每个文档的删除标记写入服务器的预写日志。它还将在内存中缓冲每次删除,以便在操作失败时回滚操作

truncate()
相比,一个侵入性小得多的操作是删除集合并重新创建它。这应该很快。 但是,如果在删除集合之前存在索引和集合的特殊设置,则需要手动重新创建/恢复它们

对于文档集合,可以通过以下方式实现:

function dropAndRecreateCollection (collectionName) {
  // save state
  var c          = db._collection(collectionName);
  var properties = c.properties();
  var type       = c.type();
  var indexes    = c.getIndexes();

  // drop existing collection
  db._drop(collectionName);

  // restore collection
  var i;
  if (type == 2) {
      // document collection
      c = db._create(collectionName, properties);
      i = 1;
  }
  else {
      // edge collection
      c = db._createEdgeCollection(collectionName, properties);
      i = 2;
  }

  // restore indexes
  for (; i < indexes.length; ++i) {
      c.ensureIndex(indexes[i]);
  }
}
函数dropAndRecreateCollection(collectionName){
//拯救国家
var c=db.\u集合(集合名称);
var properties=c.properties();
var type=c.type();
var index=c.getindex();
//删除现有集合
db._drop(collectionName);
//还原集合
var i;
如果(类型==2){
//文件收集
c=db.\u创建(集合名称、属性);
i=1;
}
否则{
//边缘集合
c=db.\u createEdgeCollection(集合名称、属性);
i=2;
}
//恢复索引
对于(;i
感谢您的详细回答和有用的脚本!drop解决方案非常适合我,因为所有配置和加载都将编写脚本。如果我在arangodb开发中,我仍然会进一步研究它,因为一个安装在30分钟内完成工作,另一个安装在第二天仍然停止。SSD、16GB RAM和相同的数据集。更新。指的是我第一篇文章中的测试。我在AWS ec2 m4.xlarge上重复了截断操作,但这次是在ArangoDB 2.7.0版上。操作成功,但未进入死区状态。有些问题得到了解决:-)但它仍然比插入相同的数据花费了更长的时间。干杯