在node/javascript/underscore中过滤大型数据集
Filtering large datasets in node/javascript/underscore
我有一个私有云中虚拟机使用记录的大数据集。每小时,我的云上运行的每个虚拟机都会生成这组记录。虚拟机都有一个记录,其中包含RAM,内存等规格,并且有一个id:字段,对应于使用记录中的virtualmachineid。我可以查询API并获得XML或JSON数据集,我选择JSON,因为它在网络上更轻量。
这是一条记录,有13种类型的使用对应于磁盘使用,带宽,运行时间等:
Usage Record:
{ account: 'user_1',
accountid: 'c22ed7ed-e51a-4782-83a7-c72e2883eb99',
domainid: 'f88d8bbf-a83b-4be1-a788-e2ab51eb9973',
zoneid: '4a7f62a8-3248-47ee-bf94-d63dac2a6668',
description: 'VM2 running time (ServiceOffering: 11) (Template: 215)',
usage: '1 Hrs',
usagetype: 1,
rawusage: '1',
virtualmachineid: 'f6661f34-4d03-4128-b738-38c330f2499c',
name: 'VM2',
offeringid: 'f1d82c2e-25e3-4c97-bae8-b6f916860faf',
templateid: '2bf2e295-fdd6-4326-a652-6d07581be070',
usageid: 'f6661f34-4d03-4128-b738-38c330f2499c',
type: 'XenServer',
startdate: '2012-12-25''T''22:00:00-06:00',
enddate: '2012-12-25''T''22:59:59-06:00' }
我想做什么:
我需要浏览虚拟机列表,其中将有数百个,并且对于每个虚拟机,为前一段时间构建使用情况报告,通常是一个月,但也可以是特别的。因此,在每个虚拟机每个月的10000+使用记录中,我需要计算每种使用类型的总数。
有没有比传统的循环-循环-循环,然后再循环的方法更有效,更新颖的方法?在伪代码中:
for (each vm in vms)
for (each usage_record in usage_records)
if (vm.id === usage_record.vmid)
switch usage_record.usage_type
case 1: its runtime
case 2: its disk usage
case 3: its some other type of usage
...
使用下划线,这是我目前所做的:
_.each(virtualMachines.virtualmachine, function (vm) {
var recs = _.filter(usageList.usagerecord, function (foo) {
return (foo.virtualmachineid === vm.id && foo.usagetype === 1);
});
console.log("recs count:" + recs.count);
//now, recs contains all the usage record type 1 for one VM
});
现在工作得很好,但我不相信它是优化的,并且不会随着VM计数的增加而扩展。对于每个VM,将有10,000个额外的使用记录添加到数据集中。
由于您需要处理每个VM 和每个VM需要的结果,我首先按VM排序列表。之后,你应该只需要一个循环和一个对象来显示"当前VM状态"。一旦在列表中遇到下一个VM,您就知道当前状态已经完成。
sortRecordsByVM();
currentStats = { runtime: 0, disk: 0, other: 0 };
currentVM;
for each record
if currentVM != record.VM
writeToOutput(currenStats);
currentStats = { runtime: 0, disk: 0, other: 0 };
addRecordTo(record, currentStats);
writeToOutput(currenStats);
也就是说:我不认为迭代超过10K条记录会给现代机器带来问题,所以我会从最简单的方法开始,只有在出现性能问题时才进行优化。
我只是不使用嵌套循环,而将查找留给内置数据结构(通常比我倾向于第一次编写的任何代码都更优化):
allStats = {};
for each record
stats = allStats[record.VM];
if (!stats)
stats = { runtime: 0, disk: 0, other: 0 };
addRecordTo(record, stats);
allStats[record.VM] = stats;
相关文章:
- 有可能过滤来自嵌入式YouTube的声音吗
- 在jstree中,如何将指定的节点集中到大型树上
- 为什么我的d3.jsselectAll+过滤器没有过滤
- 以块形式呈现大型HTML表
- 如何在大型nodeJS代码的基础上逐步引入typescript
- 具有大型几何图形的基于沙发的空间查询
- ui网格日期单元格过滤器,过滤日期格式导致显示错误的日期
- Angular:使用选择列表选择过滤代码中的对象
- 在单击时过滤 JSON
- 如何在BookshelfJS中通过加入来过滤结果
- 在android中显示固定高度的webview内的大型内容
- 如何使用javascript过滤复杂的json对象
- 具有大型数据集的组件仅在 IE11/Edge 上运行缓慢
- 在移动浏览器上显示大型文本文件
- 如何使用JQUERY解析大型XML文件并将其可视化为HTML格式
- 如何在mvc5asp.net中处理大型表
- 如何应用带过滤器的ng if来过滤记录,并在同一页面中显示两个不同的视图
- 过滤AngularJs中的数据
- jQuery mobile:处理大型过滤列表
- 在node/javascript/underscore中过滤大型数据集