如果我试图截断大约4,000万个文档的大集合,我会在arangosh中超时并且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:错误 at 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) at:1:11
Debian Jessie上的ArangoDB 2.6.9,AWS ec2 m4.xlarge,16G RAM,SSD。 该服务没有响应。我怀疑它被卡住了(不仅仅是忙碌),因为它在我停止之后才会起作用,删除/ var / lib / arangodb / databases /中的数据库,然后重新开始。
我知道由于尺寸的原因,我可能会倾向于性能极限,但我猜想无论大小如何都不会失败。
然而,在非云Windows 10,16GB RAM,SSD上,同样的动作成功了 - 过了一会儿。
这是一个错误吗?我有一些python代码,如果它有帮助,可以将虚拟数据加载到集合中。如果我提供更多信息,请告诉我。 是否有助于摆弄--server.request-timeout?
提前致谢 索伦
答案 0 :(得分:1)
增加ArangoShell的--server.request-timeout
只会增加shell在关闭空闲连接之前使用的超时时间。
arangod服务器还将关闭延迟保持活动连接,这可能会更早发生。这是通过服务器的--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]);
}
}