我正在使用Go,Revel WAF和Redis。
我必须在Redis中存储大型json数据(可能为20MB)。
json.Unmarshal()
大约需要5秒钟。有什么更好的方法呢?
我尝试了JsonLib,encode / json,ffjson,megajson,但是它们都不够快。
我曾考虑过使用groupcache,但是Json是实时更新的。
这是示例代码:
package main
import (
"github.com/garyburd/redigo/redis"
json "github.com/pquerna/ffjson/ffjson"
)
func main() {
c, err := redis.Dial("tcp", ":6379")
defer c.Close()
pointTable, err := redis.String(c.Do("GET", "data"))
var hashPoint map[string][]float64
json.Unmarshal([]byte(pointTable), &hashPoint) //Problem!!!
}
解析大型JSON数据似乎确实比应有的慢。查明原因并向Go作者提交补丁是值得的。
同时,如果您可以避免使用JSON并使用二进制格式,则不仅可以避免此问题,还可以避免出现问题。您还将获得时间,使您的代码现在可以将数字的ASCII十进制表示形式解析为它们的等效IEEE
754二进制形式(这样做时可能会引入舍入错误。)
如果您的发送者和接收者都是用Go编写的,我建议使用Go的二进制格式:
gob
。
做一个快速测试,生成一个包含2000个条目的映射,每个映射包含1050个简单浮点数,这给了我20 MB的JSON,这需要1.16秒才能在我的机器上进行解析。
对于这些快速基准测试,我采取了三种运行方式中的最佳方法,但是我确保只测量实际的分析时间,即t0 := time.Now()
在进行Unmarshal调用之前并time.Now().Sub(t0)
在其之后进行打印。
使用GOB,相同的映射会产生18 MB的数据,解析时间为115毫秒:
十分之一 。
您的结果会有所不同,具体取决于您那里实际有多少个浮标。如果您的float的有效位数很多,应使用其float64表示形式,那么20
MB的JSON包含的内容将远远少于我的200万个float。在这种情况下,JSON和GOB之间的差异将更加明显。
顺便说一句,这证明问题确实存在于JSON解析器中,而不是要解析的数据量中,也不在于要创建的内存结构中(因为两个测试都解析了约20
MB的数据并重新创建了相同的float片段)。用JSON中的字符串替换所有浮点数后,我的解析时间为1.02秒,这确认了从字符串表示形式到二进制浮点数的转换确实需要花费一定的时间(与仅移动字节相关),但这并不是主要原因。
如果发送者和解析器都不都是Go,或者如果您想进一步降低性能,则应该使用自己的自定义二进制格式,或者使用协议缓冲区,或者手动使用“ encoding /
binary”和其好友。
下面是我用来测试的脚本,在我所知道的情况下(主要来自视频),以及我在我的机器上得到的结果(python 3.8.10,numpy 1.19.5): 更新脚本:
我使用FB用户来连接这些节点。FB用户也是图中的节点,属性为person的名称,类型为person。这些节点和项节点之间的关系称为‘喜欢’。现在,如果一个人喜欢一部电影,我会通过遍历图表向他推荐书籍或音乐。这是我试图遍历图的密码查询: 这运行非常慢,有时需要500秒。我有大约13000部电影,2000本书和3000个音乐节点。连接他们的是16000人。总共有大约30万段关系。 我的问题是:
我有一个结构如下的JSON: 当我用下面的代码反序列化对象时,引用对象列表“item”给出了错误:“JSONMappingException:Can not反序列化java.util.ArrayList实例out of START_OBJECT token” 对于我来说,在一次调用中重新获得父对象Firebase和它们的子对象,对json来说,最好的POJO是什么?
问题内容: 为什么简单地更新此表以添加列需要一个多小时?该表有1500万行。它具有2个索引和一个键主键。ALTER TABLE查询现在已处于“复制到tmp表”状态1小时15分钟。 表: 问题答案: 对于非常大的表,MySQL的ALTER TABLE性能可能会成为问题。MySQL通过创建一个具有所需新结构的空表,将旧表中的所有数据插入新表中,然后删除旧表来执行大多数更改。这可能会花费很长的时间,特别
问题内容: 我很想使用BrowserSync进行开发。但是,页面加载(不仅是更改后重新加载)非常慢。 我使用模式。在没有BrowserSync的情况下浏览网页的速度应该很快。 原因之一可能是我安装BrowserSync时出现以下错误: 我从头开始安装节点(使用和软件包安装程序),但无法摆脱错误。 此外,如果使用Gulp或在命令行上运行BrowserSync,也没有什么不同。 任何想法? 问题答案:
问题内容: 我有这个查询: 内部查询运行得非常快(不到0.1秒),以获取两个ID,一个ID表示状态1,一个ID表示状态2,然后它根据主键进行选择,以便对其进行索引。说明查询说,它仅使用where搜索135k行,我一生都无法弄清楚为什么这么慢。 问题答案: