- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要使用 JSON 通过网络传输大量数据,然后在高流量和性能要求高的场景中在运行时在 Qt 中解释它。基本上需要处理任意大小和复杂性的数百甚至数千或更多 JSON 文档。我在如何做这件事上有些自由,但我正在仔细考虑我的选择,到目前为止,我对它们看起来的样子并不满意。
主要关注的是查找和修改速度,而从/到 JSON 的转换在我的上下文中不太重要,因为我可以处理较慢的摄入量和/或无论如何都会不稳定的输出。但是一旦数据通过,它就需要随时可用。
我的选择:
1) 选项 1 是直接使用 Qt 5 中的 JSON 支持类。然而,缺点是为了修改 JSON 数据树中某处的单个值,需要复制整个内容,然后使用修改后的值再次从中创建 JSON。这对于单个修改来说可能是相当昂贵的。 QJsonValueRef 在某种程度上对此有所帮助,但不允许遍历整个结构,因为结构中的每个对象仍需要复制。
2) 将 JSON 转换为 QVariantMap (QMap) 并使用它。除了来回转换的开销之外,它遇到与 1) 相同的问题,因为 QAssociativeIterable 不返回对其项目的引用,因此如果不首先复制每个 QVariant 就无法下降到结构中。基本上它允许在 QVariantMap 的单个子级别中进行非复制迭代。它可能仍然比直接使用 Qt 的 JSON 类要好,但本质上它似乎具有与 1 完全相同的限制)。
3) 将 JSON 转换为我自己的数据结构,这将允许在不复制任何值的情况下通过结构下降和修改数据。每个“级别”都将成为一个对象,其父级将拥有访问权限,从而允许对其内容进行任意深度的非复制访问。这个解决方案会受到这样一个事实的影响,即我很可能无法为每个“级别”实现几乎与 Qt/STL 容器一样高效的查找机制。但也许我可以通过使用尽可能快的 operator== 重载将子指针存储在其中来将 Qt 的容器与这种方法结合起来......
4) 将 JSON 转换为平面二维数据结构,例如:
Level1/Level2/key : value
Level1/Level2/key2 : value2
Level1/key3 : value3
这种方法在数据存储方面存在大量冗余,并且在与 JSON 的转换中可能成本很高,但可以说提供了最快的查找/修改速度,因为它不需要下降到任何数据结构。然而,这种好处的成本对我来说似乎太大了(冗余和缓慢的转换)。
我有点倾向于选项 3,但也许还有其他选项。我想听听您对这个问题的想法和/或想法。或者,也许 JSON 一开始就不是通过网络传输数据的正确工具。
最佳答案
如果you look at the Qt source code你会意识到 Qt json 对象已经被优化了:
要遍历结构,请使用 QJsonObject
类。
QJsonValue QJsonObject::value(const QString & key);
对于对象类型来说是最小的。但是正如您所指出的,它为字符串类型创建了一个新字符串;它还对数值执行“转换”。请注意,在解析进一步处理之后\内存开销仅在您开始处理 QJsonValue
时才会出现。
因此选项 1 并没有那么糟糕。考虑到您的条件,选项 2 简直太可怕了。我没有看到任何优势。由于您自己指定的原因,选项 4 是噩梦般的。那种在取得一些进步后立即后悔的工作。
如果严格使用 Qt json 类还不够,那就转向更高效的库,如 rapidjson .
优点:
不方便
它做了您的选项 3 试图做的事情。
关于c++ - 在 Qt 中迭代和修改 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543175/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!