citylots.json 上的 Aeson 基准测试 space 泄漏 (?)
aeson benchmark space leak (?) on citylots.json
我一直在研究 Aeson 解析器的基准测试套件,比较他们的严格解析器和惰性解析器得到了一些令人惊讶的结果:
- 在 benchmark 附带的所有数据集上,严格解析器总是花费更多时间(这是预期的)但从不保存任何 space。
- 运行
AesonParse
benchmark on citylots.json
比其他同等大小的数据集花费更多的时间和 space。
获取基准运行:
cd aeson; cabal install
cd benchmark; make
./AesonParse_p [blksz] [runs] [path-to-json] +RTS -p -hc
以下是我在 +RTS
开启时获得的一些配置文件:
根据配置文件,泄漏可追溯到 Data.Aeson.Parser.Internal
中的 jstring_
有人知道发生了什么事吗?
Sun Nov 15 13:56 2015 Time and Allocation Profiling Report (Final)
AesonParse_p +RTS -p -hc -RTS 105532 700 json-data/jp100.json
total time = 3.42 secs (3417 ticks @ 1000 us, 1 processor)
total alloc = 4,191,614,072 bytes (excludes profiling overheads)
COST CENTRE MODULE %time %alloc
jstringbang_ Data.Aeson.Parser.Internal 96.4 93.1
arrayValues Data.Aeson.Parser.Internal 1.7 1.9
object_' Data.Aeson.Parser.Internal 1.1 1.9
main.\.\.loop.refill Main 0.7 3.2
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 116 0 0.0 0.0 100.0 100.0
main Main 233 0 0.0 0.0 100.0 100.0
main.blkSize Main 242 1 0.0 0.0 0.0 0.0
main.count Main 239 1 0.0 0.0 0.0 0.0
main.\ Main 234 1 0.0 0.0 100.0 100.0
main.\.\ Main 235 1 0.0 0.0 100.0 100.0
main.\.\.rate Main 252 1 0.0 0.0 0.0 0.0
main.\.\.loop Main 238 701 0.1 0.0 100.0 100.0
object_' Data.Aeson.Parser.Internal 245 0 1.1 1.9 99.2 96.8
jstring_ Data.Aeson.Parser.Internal 247 0 96.4 93.1 98.1 94.9
array_' Data.Aeson.Parser.Internal 249 0 0.0 0.0 1.7 1.9
arrayValues Data.Aeson.Parser.Internal 251 0 1.7 1.9 1.7 1.9
main.\.\.loop.refill Main 241 1 0.7 3.2 0.7 3.2
CAF GHC.IO.FD 217 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Encoding.Iconv 215 0 0.0 0.0 0.0 0.0
CAF Text.Read.Lex 209 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Handle.FD 202 0 0.0 0.0 0.0 0.0
CAF GHC.Conc.Signal 198 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Handle.Text 191 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Encoding 188 0 0.0 0.0 0.0 0.0
CAF Data.Time.Clock.UTC 129 0 0.0 0.0 0.0 0.0
CAF Data.Aeson.Parser.Internal 124 0 0.0 0.0 0.0 0.0
array_' Data.Aeson.Parser.Internal 248 1 0.0 0.0 0.0 0.0
arrayValues Data.Aeson.Parser.Internal 250 1 0.0 0.0 0.0 0.0
jstringbang_ Data.Aeson.Parser.Internal 246 1 0.0 0.0 0.0 0.0
object_' Data.Aeson.Parser.Internal 244 1 0.0 0.0 0.0 0.0
CAF Main 123 0 0.0 0.0 0.0 0.0
main Main 232 1 0.0 0.0 0.0 0.0
main.blkSize Main 243 0 0.0 0.0 0.0 0.0
main.count Main 240 0 0.0 0.0 0.0 0.0
main.\ Main 236 0 0.0 0.0 0.0 0.0
main.\.\ Main 237 0 0.0 0.0 0.0 0.0
据我所知,这是意料之中的事情。
文件 citylots.json 是一个 167 MB 的文件,由一个对象组成。 AesonParse 程序正在内存中构建整个对象,这解释了配置文件中的内存斜坡。
相比之下,http://jsonstudio.com/resources/ 处的文件 companies.json 和 enron.json 是 "line-oriented" JSON 文件 - 每行都是一个 JSON 对象对象之间没有逗号。当您 运行 AesonParse 处理其中任何一个文件时,它只会读取第一行。
我一直在研究 Aeson 解析器的基准测试套件,比较他们的严格解析器和惰性解析器得到了一些令人惊讶的结果:
- 在 benchmark 附带的所有数据集上,严格解析器总是花费更多时间(这是预期的)但从不保存任何 space。
- 运行
AesonParse
benchmark oncitylots.json
比其他同等大小的数据集花费更多的时间和 space。
获取基准运行:
cd aeson; cabal install
cd benchmark; make
./AesonParse_p [blksz] [runs] [path-to-json] +RTS -p -hc
以下是我在 +RTS
开启时获得的一些配置文件:
根据配置文件,泄漏可追溯到 Data.Aeson.Parser.Internal
中的 jstring_
有人知道发生了什么事吗?
Sun Nov 15 13:56 2015 Time and Allocation Profiling Report (Final)
AesonParse_p +RTS -p -hc -RTS 105532 700 json-data/jp100.json
total time = 3.42 secs (3417 ticks @ 1000 us, 1 processor)
total alloc = 4,191,614,072 bytes (excludes profiling overheads)
COST CENTRE MODULE %time %alloc
jstringbang_ Data.Aeson.Parser.Internal 96.4 93.1
arrayValues Data.Aeson.Parser.Internal 1.7 1.9
object_' Data.Aeson.Parser.Internal 1.1 1.9
main.\.\.loop.refill Main 0.7 3.2
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 116 0 0.0 0.0 100.0 100.0
main Main 233 0 0.0 0.0 100.0 100.0
main.blkSize Main 242 1 0.0 0.0 0.0 0.0
main.count Main 239 1 0.0 0.0 0.0 0.0
main.\ Main 234 1 0.0 0.0 100.0 100.0
main.\.\ Main 235 1 0.0 0.0 100.0 100.0
main.\.\.rate Main 252 1 0.0 0.0 0.0 0.0
main.\.\.loop Main 238 701 0.1 0.0 100.0 100.0
object_' Data.Aeson.Parser.Internal 245 0 1.1 1.9 99.2 96.8
jstring_ Data.Aeson.Parser.Internal 247 0 96.4 93.1 98.1 94.9
array_' Data.Aeson.Parser.Internal 249 0 0.0 0.0 1.7 1.9
arrayValues Data.Aeson.Parser.Internal 251 0 1.7 1.9 1.7 1.9
main.\.\.loop.refill Main 241 1 0.7 3.2 0.7 3.2
CAF GHC.IO.FD 217 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Encoding.Iconv 215 0 0.0 0.0 0.0 0.0
CAF Text.Read.Lex 209 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Handle.FD 202 0 0.0 0.0 0.0 0.0
CAF GHC.Conc.Signal 198 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Handle.Text 191 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Encoding 188 0 0.0 0.0 0.0 0.0
CAF Data.Time.Clock.UTC 129 0 0.0 0.0 0.0 0.0
CAF Data.Aeson.Parser.Internal 124 0 0.0 0.0 0.0 0.0
array_' Data.Aeson.Parser.Internal 248 1 0.0 0.0 0.0 0.0
arrayValues Data.Aeson.Parser.Internal 250 1 0.0 0.0 0.0 0.0
jstringbang_ Data.Aeson.Parser.Internal 246 1 0.0 0.0 0.0 0.0
object_' Data.Aeson.Parser.Internal 244 1 0.0 0.0 0.0 0.0
CAF Main 123 0 0.0 0.0 0.0 0.0
main Main 232 1 0.0 0.0 0.0 0.0
main.blkSize Main 243 0 0.0 0.0 0.0 0.0
main.count Main 240 0 0.0 0.0 0.0 0.0
main.\ Main 236 0 0.0 0.0 0.0 0.0
main.\.\ Main 237 0 0.0 0.0 0.0 0.0
据我所知,这是意料之中的事情。
文件 citylots.json 是一个 167 MB 的文件,由一个对象组成。 AesonParse 程序正在内存中构建整个对象,这解释了配置文件中的内存斜坡。
相比之下,http://jsonstudio.com/resources/ 处的文件 companies.json 和 enron.json 是 "line-oriented" JSON 文件 - 每行都是一个 JSON 对象对象之间没有逗号。当您 运行 AesonParse 处理其中任何一个文件时,它只会读取第一行。