- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
JRuby 9.2、Rails 4.2
我一直致力于读取/转储大型 JSON 对象、100+MB 的文件,这些文件通常会挂起几分钟,然后在写出时耗尽内存。
我注意到它特别发生在使用 to_json
时。下面是一个 4MB 的文件,所以它实际上是完整的:
pry(main)> f = File.open('nvdcve-1.0-recent.json'){|f| JSON.load(f) }
pry(main)> puts Benchmark.measure{ JSON.dump(f) }
0.230000 0.010000 0.240000 ( 0.081894)
=> nil
pry(main)> puts Benchmark.measure{ f.to_json }
1.020000 0.020000 1.040000 ( 0.820851)
=> nil
问题的根源是 ActiveSupport 在一堆事情上覆盖了 to_json
:
pry(main)> f.method(:to_json)
=> #<Method: Hash#to_json(to_json_with_active_support_encoder)>
pry(main)> puts Benchmark.measure{ f.to_json_without_active_support_encoder }
0.040000 0.000000 0.040000 ( 0.035408)
pry(main)> puts Benchmark.measure{ f.to_json_with_active_support_encoder }
1.170000 0.010000 1.180000 ( 0.812674)
参见此处:https://apidock.com/rails/Object/to_json_with_active_support_encoder
那么 ActiveSupport::JSON.encode
与 JSON gem 的 to_json
到底有什么不同,导致它慢得多,即使是在一个不起眼的 JSON 文件上也是如此是从 JSON 文件加载的吗?
如果我覆盖 to_json
不使用 ActiveSupport 变体,我会破坏任何 Rails 功能吗?
最佳答案
根据to the source ActiveSupport::JSON 几乎只是 JSON gem 之上的附加层——它实际上完成了大部分繁重的工作。它主要做的是:
ESCAPED_CHARS = {
"\u2028" => '\u2028',
"\u2029" => '\u2029',
">" => '\u003e',
"<" => '\u003c',
"&" => '\u0026',
}
评论没有说明有问题的浏览器是哪些,这对于现代浏览器来说可能完全不是问题。
# Convert an object into a "JSON-ready" representation composed of
# primitives like Hash, Array, String, Numeric,
# and +true+/+false+/+nil+.
# Recursively calls #as_json to the object to recursively build a
# fully JSON-ready object.
#
# This allows developers to implement #as_json without having to
# worry about what base types of objects they are allowed to return
# or having to remember to call #as_json recursively.
#
# Note: the +options+ hash passed to +object.to_json+ is only passed
# to +object.as_json+, not any of this method's recursive +#as_json+
# calls.
def jsonify(value)
case value
when String
EscapedString.new(value)
when Numeric, NilClass, TrueClass, FalseClass
value.as_json
when Hash
Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }]
when Array
value.map { |v| jsonify(v) }
else
jsonify value.as_json
end
end
这可能是最重要的部分,因为 #as_json
是模型如何将自身呈现为 JSON 的关键。它还处理转换日期和时间戳以及其他非基元(ActiveSupport 为这些提供了 #as_json
方法)。删除它很可能会破坏很多东西。
根据您的用例,您也许可以从您的模型对象手动创建 ruby 对象(数组、哈希等)并使用 JSON.generate(data)
- 我不确定它会表现得更好虽然。
关于ruby-on-rails - 为什么 ActiveSupport::JSON.encode 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57334126/
我使用术语“词法编码”是因为我没有更好的编码。 与字母相反,单词可以说是交流的基本单位。 Unicode 尝试为所有已知字母表的每个字母分配一个数值。对一种语言来说是字母,对另一种语言来说是字形。 U
我在UTF-8中有csv文件,我想将其保存在西里尔字母(Windows 1251)中...在中,我仅找到Atom -重新打开,并使用ctrl+shift+u编码 在 Sublime Text 3 中,
在lua 5.3引用手册中,我们可以看到: Lua is also encoding-agnostic; it makes no assumptions about the contents of a
看完后how gzip compression works它让我思考。如果源和代理服务器 (CDN) 都支持 gzip,则添加 Vary: Accept-Encoding头需要吗? 最佳答案 Vary
我正在向我的项目添加一项功能,我们将生成指向我们网站内部内容的链接,并且我们希望这些链接尽可能短,因此我们将制作自己的“URL 缩短器”。 我想知道生成的短网址的最佳编码/字母表是什么。这很大程度上是
我构建了一个用于压缩 HTTP 输出的模块。阅读spec ,我在以下几件事上没有发现明显的区别: 接受编码: 是否应将其视为与 Accept-Encoding: * 相同,还是视为不存在 header
在下面的代码中: package main import ( "bytes" "encoding/json" "fmt" ) type Student struct {
这个问题在这里已经有了答案: Why does encode delete the argument? (1 个回答) 6年前关闭。 Encode::encode 的文档说: encode $octe
在Android4.1中,实时编码应用中经常会请求关键帧。但是如何使用 MediaCodec 对象呢?当前的 Android4.2 SDK 似乎不支持它。 最佳答案 您可以 通过在排队输入缓冲区时指定
我有 CSV 格式的数据,这些数据在字符编码方面被严重打乱,可能在不同的软件应用程序(LibreOffice Calc、Microsoft、Excel、Google Refine、自定义 PHP/My
您可能知道,在 Perl 中,“utf8”意味着 Perl 对 UTF-8 的宽松理解,它允许使用技术上不是 UTF-8 中有效代码点的字符。相比之下,“UTF-8”(或“utf-8”)是 Perl
本文整理了Java中org.geotools.ysld.encode.YsldEncoder.encode()方法的一些代码示例,展示了YsldEncoder.encode()的具体用法。这些代码示例
现在还没有任何关于红色的书,因为它太新了。因此,我正在尝试遵循一本旧的 Rebol 书,并从中挽救我能得到的东西。 我发现一些命令,例如 read,由于文件编码的原因,我无法执行代码。 save %
错误:无法映射用于编码 UTF-8 的字符。由于版权特征,我收到此错误。我使用的是 Netbeans 7.2。 /** * � 2006 * * This class was generate
现在还没有任何关于红色的书,因为它太新了。因此,我正在尝试遵循一本旧的 Rebol 书,并从中挽救我能得到的东西。 我发现一些命令,例如 read,由于文件编码的原因,我无法执行代码。 save %
错误:无法映射用于编码 UTF-8 的字符。由于版权特征,我收到此错误。我使用的是 Netbeans 7.2。 /** * � 2006 * * This class was generate
我正在尝试使用客户端提供的值在 PHP 中测试 Soap Security header 。 他们提供的值(value)如... wTAmCL9tmg6KNpeAQOYubw== ...并说这是一个
这个问题已经有答案了: ClassNotFoundException/NoClassDefFoundError in my Java web application (3 个回答) 已关闭 8 年前。
世界!我正在使用 .Net Framework 4 System.Net.Sockets.TcpClient 编写简单的 HTML 服务器。 我在 StringBuilder html 中有 HTML
我正在尝试使用 Yii 来提供网络服务。自动生成的 wsdl 如下。我可以从命令行成功使用 Web 服务,但是通过 Web 浏览器,我得到了 SOAP-ERROR: Encoding: Violati
我是一名优秀的程序员,十分优秀!