arangodb truncate在大型集合上失败
我在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增加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
--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版上。操作成功,但未进入死区状态。有些问题得到了解决:-)但它仍然比插入相同的数据花费了更长的时间。干杯