lor*_*isi 7 xml json nvidia node.js
我想输入有关机器可用 GPU 和状态的系统信息以进行实时监控。我XML使用以下方式输出 GPU 信息
$ nvidia-smi -x -q
Run Code Online (Sandbox Code Playgroud)
此命令将打印输出当前 GPU 状态(如使用情况、温度等)以及格式化的 XML(具有定义的 DTD)。我的 XML 输出在这里。
没有直接从nvidia-smijson 输出的选项,所以此时我看到的唯一选项是将 XML 从 Node.js 转换为 JSON。
问题是我需要它作为 JSON,所以我尝试在我的Node应用程序中转换为 JSON。我依次使用了几个 npm 可用模块,如 xml2json、node-xml2js 等,但每个模块都有不同的错误(null、未定义等)。在浏览器中使用简单的 DOMParser (window.DOMParser) 即可。这似乎是这个 XML 的一个错误,因为当我有一个像这里这样的 GPU 输出时,JSON 会被很好地转换,如这个要点所示。
我使用节点生成来调用nvdia-smi命令,然后解析输出,如下所示:
(function() {
var XMLParser = require('./xml2json');
function gpuInfo() {
var _data='';
var curl = require('child_process').spawn('nvidia-smi', ['-x','-q']);
curl.stdout.on('data', function(data) {
_data+= new Buffer(data,'utf-8').toString();
});
curl.stdout.on('end', function(data) {
var x2js = new XMLParser();
var json = x2js.xml_str2json( _data );
console.log(JSON.stringify( json,null,2));
});
curl.on('exit', function(code) {
if (code != 0) {
console.log('Failed: ' + code);
}
});
}
module.exports = {
gpuInfo:gpuInfo
}
Run Code Online (Sandbox Code Playgroud)
在本例中,我使用的是xml2json 浏览器客户端模块的修改xmldom版本与模块相结合,但它似乎不是一个稳定的解决方案,所以我的解析是在这里完成的,如下所示:
this.parseXmlString = function(xmlDocStr) {
if (xmlDocStr === undefined) {
return null;
}
var xmlDoc;
var DOMParser = require('xmldom').DOMParser;
var parsererrorNS = null;
try {
xmlDoc = new DOMParser().parseFromString( xmlDocStr, "text/xml" );
if( parsererrorNS!= null && xmlDoc.getElementsByTagNameNS(parsererrorNS, "parsererror").length > 0) {
xmlDoc = null;
}
}
catch(err) {
xmlDoc = null;
}
return xmlDoc;
};
Run Code Online (Sandbox Code Playgroud)
离开这里
尝试使用https://github.com/Cheedoong/xml2json 它更快,并且可以用作像 jq 这样的二进制工具。你会像这样运行:
nvidia-smi -x -q | xml2json | jq
Run Code Online (Sandbox Code Playgroud)
结果将是这样的:
{
"nvidia_smi_log": {
"timestamp": "Thu Aug 29 13:45:26 2019",
"driver_version": "387.34",
"attached_gpus": "9",
"gpu": [
{
"@id": "00000000:03:00.0",
"product_name": "P106-090",
"product_brand": "GeForce",
"display_mode": "Disabled",
"display_active": "Disabled",
"persistence_mode": "Enabled",
"accounting_mode": "Disabled",
"accounting_mode_buffer_size": "1920",
"driver_model": {
"current_dm": "N/A",
"pending_dm": "N/A"
},
"serial": "N/A",
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4300 次 |
| 最近记录: |