Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
use non blocking json parser #132
Comments
|
I'm not against it at all :) Typically everyone uses the default limit value in the parsers here and JSON.parse for that limit takes well under 1ms to parse, so it's typically not an issue. If you want to put together a PR to implement this (and perhaps get urlencoded parser to be streaming too in that PR) that would be awesome, and the best way to move this forward :) |
|
I've kind of ditched the idea of parsing big json from an api and went with a different approach. In the meantime, maybe we can discuss it a little here for the sake of having some reference
|
|
I've never used any, so I have no preference. If you can find one that is well-supported, that would be best :)
Yea, it would probably be slower, what we need to do would need to be determined by benchmarks. Also, be careful, as just keying a switch off |
|
I have done research on this topic and it seems this topic is already discussed on node nodejs/node#2031 (comment). To my understanding what are suggesting on doing is not feasible. Did I miss something? |
|
Good find @ghassanmas, that comment gets to the point well, and IMO probably a good indication that this module should probably not take an opinion on this directly. Offering an interface to override the JSON parse implementation (and then supporting async versions of the parse) is a good idea, but directly implementing a specific one (even if it is the one recommended in that comment) is probably not a good long term solution. |
|
I would like to see what is the recommended direction here:
so the second point necessitates the first, and the first is already discarded as an option. So? should we conclude and close this as |
|
Just a bit of a left field solution: I've stumbled upon https://github.com/bjouhier/i-json, which can handle json chunks directly from a stream, instead of concatenating the text and then deciding what to do with it. It's not an easy lift, but could be pretty interesting. I think I'll do a small POC to check feasability and performance overhead. |
|
just so that we are here - if you are going to do a POC, can I request to test with this yieldable-json as well?
|
|
Update on my POC:
Tests were performed using ApacheBench against a hello-world basic API on Node 8 (due to the i-json package), creating 100k requests with json bodies of 10kb and 100kb, at a concurrency of 100 I'm not sure if that's an indication that problems only happen on extremely large JSON bodies- which to me is a rare edge-case. I did notice a possible area for improvement though, body parsing as a middleware typically happens before routing, which means that POST requests which would result in a 404 still go through body-parsing. @wesleytodd I'm not sure if that's significant. |
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
|
I was reading Express docs and found this, I think this is at least a great discussion around interesting topic, so let me try to add my small contribution. First of all, we need to decide which approach or strategy to implement a non-blocking parser. My ideas are: Limit the amount of time the parser can useStart the parser stopping it after a short period of time, keep the state for the next cycle of parsing. Repeat this until the stream is completely parsed. Parse it in a different thread or processStarting a different thread or process, parsing the stream and then resolving the value back to the original caller. A single process with its own event loop can be used in this case, so no one needs to deal with several threads running at the same time. The actual parserThe parser could be built extending the actual Node.js JSON parser, if this is possible no one needs to build a parser from scratch. I personally think that the incremental option is more viable, since no one needs to deal with a second running thread or process and IPC. The strategy now should be building PoCs of some different approaches and comparing them against each other, both in performance and maintainability. |

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.

Is there an option to use a non blocking (streaming?) json parser ?
The problem with JSON.parse is that it's blocking the event loop and for big json parsing it can be a problem