我使用node.js和mongodb开始了一个新项目,差不多2天后我在MongoDB中收集了大约600k个对象.我已经注意到对性能的巨大(负面)影响,我开始担心我是否应该尽可能地移动到另一个数据库,或者我是否应该坚持使用Mongo并进行一些(更多)优化.
基本上我存储这样的坐标:
[x1] => 687
[y1] => 167
[x2] => 686
[y2] => 167
[c] => 0
[s] => 0
[m] => 1299430700312
[_id] => MongoId Object (
[$id] => 4d73bd2c82bb5926780001ec
)
Run Code Online (Sandbox Code Playgroud)
不多......我的查询看起来像这样:
{'$or': [ { x1: {'$gte' : 0, '$lt' : 1000 }, y1: {'$gte' : 0, '$lt' : 1000 } , { x2: {'$gte' : 0, '$lt' : 1000 }, y2: {'$gte' : 0, '$lt' : 1000 } } ] }
Run Code Online (Sandbox Code Playgroud)
我已经尝试为每个字段设置索引:x1,y1,y1,y1以及:{x1:1,y1:1},{x2:1,y2:1}
.此外,我还只提取了我需要的必填字段......但是,执行结果集约为40k的查询仍然在2-8secs的运行时间内完成.顺便说一句:在PHP中执行相同的查询会因内存不足的消息(256MB RAM)而死亡.
这台机器是Intel(R)Core(TM)i7 CPU 920 …
我经历过一种让我疯狂的行为,我无法解决它.
我有一个脚本打开一些mysql连接并将它们存储在一个数组中.为了防止MySQL关闭未使用的连接(该进程应该全天候运行),我使用setInterval频繁地触发pingSync().这种方法在我的另一个项目中已经工作了好几个月,但是在节点为0.8.14的新主机上,这种行为很奇怪.
setInterval(function () {
var count = 0;
console.log('---------------------------------------------------------');
console.log('Length: ');
console.log(connections.length);
connections.forEach(function(connection){
var res = connection.pingSync();
console.log('PING mysql '+count+ ' / '+(new Date().getTime()));
console.log(res);
count++;
});
console.log('---------------------------------------------------------');
}, 50000);
Run Code Online (Sandbox Code Playgroud)
预期结果:
---------------------------------------------------------
Length:
4
PING mysql 0 / 1351603868929
true
PING mysql 1 / 1351603868929
true
PING mysql 2 / 1351603868929
true
PING mysql 3 / 1351603868929
true
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我得到的结果:
#1
---------------------------------------------------------
Length:
4
PING mysql 0 / 1351603868929
true
4
PING mysql 0 / 1351603868929
true
PING mysql …
Run Code Online (Sandbox Code Playgroud) 我想批量处理大量记录(> 400k)并将其插入数据库中。
我知道如何使用for()或underscore.each()遍历数组,而且我知道如何异步地将记录插入各种(无)SQL数据库。那不是问题-问题是我找不到同时做这两种方法的方法。
数据库分发本身在这里不起作用,该原理适用于任何具有异步接口的(NO)SQL数据库。
我正在寻找一种模式来解决以下问题:
循环方法:
var results = []; //imagine 100k objects here
_.each(results,function(row){
var newObj = prepareMyData(row);
db.InsertQuery(newObj,function(err,response) {
if(!err) console.log('YAY, inserted successfully');
});
});
Run Code Online (Sandbox Code Playgroud)
这种方法显然是有缺陷的。它有点用插入查询来锤击数据库,而不必等待单个查询完成。说到使用连接池的MySQL适配器,您很快就会用尽连接,脚本将失败。
递归方法:
var results = []; //again, full of BIGDATA ;)
var index = 0;
var myRecursion = function()
{
var row = results[index];
var data = prepareMyData(row);
db.InsertQuery(data,function(err, response)
{
if (!err)
{
console.log('YAY, inserted successfully!');
index++; //increment for the next recursive call of:
if (index < results.length) myRecursion();
}
}
} …
Run Code Online (Sandbox Code Playgroud) 我在jenkins中设置了一个部署过程,该过程首先将整个JavaScript应用程序本地安装在jenkins服务器上,开始进行测试/构建应用程序,然后将所有内容复制到暂存机上。
昨天我注意到我的package.json中有一个错字,npm无法安装更新的模块,因此引发了警告。
Jenkins似乎已经注意到了该问题,并将构建标记为UNSTABLE,但仍继续进行部署(使用ssh-copy插件的构建后任务)。
NPM无法安装模块时,有没有办法停止构建过程?
我现在已经在键盘上敲了大约一个星期了,我无法为我的问题找到合适的解决方案.我认为它比HTML Canvas更加数学相关...希望有人可以指出我正确的方向.
我有一个HTML Canvas,用户可以使用鼠标和非常简单的moveTo()和lineTo()函数绘制线条.用户完成后,我将coord保存在MongoDB中.当用户稍后再次点击页面时我想显示他的绘图但是我不想一次性加载所有存储坐标的整个图片,我想将其返回到图块中(通过缓存每个图块来获得更好的性能).
瓷砖是200x200像素(固定偏移和宽度,从0 - > 200-> 400 - > ...开始).现在,当用户从50,50(x/y)到250,250(x/y)绘制一条线时,每个边界框(平铺)中只有一个点.我需要分割线条并计算每个边界框(平铺)中每条线的起点和终点.否则我无法部分绘制图像(在图块中).当一条线穿过多个边界框(瓦片)时,它会变得更加复杂.例如:100,100(x/y) - > -1234,-300(x/y).这些线可以从任何点(+/-)到任何距离的ANY方向.
当然,我看了一下Bresenham的旧算法并且它有效 - 部分地,但它似乎是对我来说最长且最耗费资源的解决方案.
所以,我在这里的原因是我希望有人可以指出我正确的方向(可能)另一种计算每个边界框我的线的起点/终点的方法.
代码示例在JavaScript或PHP中非常受欢迎.
感谢您阅读和思考:)