【发布时间】:2016-09-13 01:40:24
【问题描述】:
我有以下 JSON 文件:
sensorlogs.json
{"arr":[{"UTCTime":10000001,"s1":22,"s2":32,"s3":42,"s4":12},
{"UTCTime":10000002,"s1":23,"s2":33,"s4":13},
{"UTCTime":10000003,"s1":24,"s2":34,"s3":43,"s4":14},
{"UTCTime":10000005,"s1":26,"s2":36,"s3":44,"s4":16},
{"UTCTime":10000006,"s1":27,"s2":37,"s4":17},
{"UTCTime":10000004,"s1":25,"s2":35,"s4":15},
...
{"UTCTime":12345678,"s1":57,"s2":35,"s3":77,"s4":99}
]}
传感器 s1、s2、s3 等都以不同的频率传输(请注意,s3 每 2 秒传输一次,并且时间戳可能是无序的)。
我怎样才能实现类似 -
Analyzing s1:
s = [[10000001, 22], [10000002, 23],.. [12345678,57]]
s1 had 2 missing entries
Analyzing s2:
s = [[10000001, 32], [10000002, 33],.. [12345678,35]]
s2 had 0 missing entries
Analyzing s3:
s = [[10000001, 42], [10000003, 43],.. [12345678,77]]
s3 had 0 missing entries
Analyzing s4:
s = [[10000001, 12], [10000003, 13],.. [12345678,99]]
s4 had 1 missing entries
sensorlogs.json 为 16 GB。
可以根据连续 UTC 时间戳的差异找到丢失的条目。每个传感器都以已知频率传输。
由于内存限制,我无法使用多个大型数组进行分析,因此我必须对同一个 JSON 日志文件进行多次传递,并且仅使用单个大型数组进行分析。
我现在所拥有的是关注 -
var result = [];
//1. Extract all the keys from the log file
console.log("Extracting keys... \n");
var stream = fs.createReadStream(filePath);
var lineReader = lr.createInterface(
{
input: stream
});
lineReader.on('line', function (line)
{
getKeys(line);//extract all the keys from the JSON
});
stream.on('end', function()
{
//obj -> arr
for(var key in tmpObj)
arrStrm.push(key);
//2. Validate individual sensors
console.log("Validating the sensor data ...\n");
//Synchronous execution of the sensors in the array
async.each(arrStrm, function(key)
{
{
currSensor = key;
console.log("validating " + currSensor + "...\n");
stream = fs.createReadStream(filePath);
lineReader = lr.createInterface(
{
input: stream
});
lineReader.on('line', function (line)
{
processLine(line);//Create the arrays for the sensors
});
stream.on('end', function()
{
processSensor(currSensor);//Process the data for the current sensor
});
}
});
});
function getKeys(line)
{
if(((pos = line.indexOf('[')) >= 0)||((pos = line.indexOf(']')) >= 0))
return;
if (line[line.length-1] == '\r') line=line.substr(0,line.length-1); // discard CR (0x0D)
if (line[line.length-1] == ',') line=line.substr(0,line.length-1); // discard ,
// console.log(line);
if (line.length > 1)
{ // ignore empty lines
var obj = JSON.parse(line); // parse the JSON
for(var key in obj)
{
if(key != "debug")
{
if(tmpObj[key] == undefined)
tmpObj[key]=[];
}
};
}
}
当然这不起作用,我在网上找不到任何解释如何实现的东西。
注意: 我可以选择我选择的任何语言来开发这个工具(C/C++、C#/Java/Python),但我选择使用 JavaScript,因为它能够轻松解析 JSON 数组(而且我也有兴趣在 JS 中变得更好) )。 如果 JavaScript 不是最好的语言来制作这样的工具,有人愿意建议一种替代语言吗?
编辑:一些不是很清楚或者我之前没有包含的重要信息,但看起来在问题中包含很重要 -
- JSON 日志中的数据不是实时流式传输,而是存储在硬盘中的 JSON 文件
- 存储的数据不是按时间顺序排列的,这意味着时间戳的顺序可能不正确。因此,每个传感器数据都需要根据时间戳在存储在数组中 进行排序
- 我不能为每个传感器使用单独的数组(这与在 RAM 中存储整个 16 GB JSON 相同),为了节省内存,一次只能使用一个数组。是的,我的日志中有超过 4 个传感器,这只是一个示例(大概有 20 个)
我已经修改了我的 JSON 和预期的输出
一种解决方案可能是对 JSON 文件进行多次传递,一次将一个带有时间戳的传感器数据存储在一个数组中,然后对数组进行排序,最后分析数据是否存在损坏和间隙。这就是我在上面的代码中尝试做的事情
【问题讨论】:
-
"§ 存储的数据不是按时间顺序排列的,这意味着时间戳可能不是正确的顺序" "§ 可以根据连续 UTC 时间戳的差异找到丢失的条目" : @ 987654324@、
sed和sort来救援!
标签: javascript json node.js