Part 6: 1M-record generator with measured heap delta
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package com.ankurm.jackson3.part6streaming;
|
||||
|
||||
import tools.jackson.core.JsonEncoding;
|
||||
import tools.jackson.core.JsonGenerator;
|
||||
import tools.jackson.core.ObjectWriteContext;
|
||||
import tools.jackson.core.json.JsonFactory;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Post: Streaming API and JsonNode — https://ankurm.com/jackson-streaming-api-jsonnode/
|
||||
* Section: "Writing JSON with JsonGenerator"
|
||||
*
|
||||
* Jackson 3 differences: writeNumberField/writeStringField are now
|
||||
* writeNumberProperty/writeStringProperty, and the factory needs an
|
||||
* ObjectWriteContext. The post's 1,000,000-record loop is kept — it is the whole
|
||||
* point of streaming — and the peak heap is measured so "constant memory" is a
|
||||
* number rather than a claim.
|
||||
*/
|
||||
public class G02StreamingGenerator {
|
||||
|
||||
private static final int RECORD_COUNT = 1_000_000;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
File output = File.createTempFile("output", ".json");
|
||||
output.deleteOnExit();
|
||||
|
||||
JsonFactory jsonFactory = new JsonFactory();
|
||||
Runtime runtime = Runtime.getRuntime();
|
||||
long before = runtime.totalMemory() - runtime.freeMemory();
|
||||
long start = System.nanoTime();
|
||||
|
||||
try (JsonGenerator generator = jsonFactory.createGenerator(
|
||||
ObjectWriteContext.empty(), output, JsonEncoding.UTF8)) {
|
||||
|
||||
generator.writeStartArray();
|
||||
for (int recordIndex = 0; recordIndex < RECORD_COUNT; recordIndex++) {
|
||||
generator.writeStartObject();
|
||||
generator.writeNumberProperty("id", recordIndex);
|
||||
generator.writeStringProperty("status", "active");
|
||||
generator.writeEndObject();
|
||||
}
|
||||
generator.writeEndArray();
|
||||
}
|
||||
|
||||
long elapsedMs = (System.nanoTime() - start) / 1_000_000;
|
||||
long after = runtime.totalMemory() - runtime.freeMemory();
|
||||
|
||||
System.out.println("records written : " + RECORD_COUNT);
|
||||
System.out.println("file size : " + (output.length() / 1024 / 1024) + " MB");
|
||||
System.out.println("elapsed : " + elapsedMs + " ms");
|
||||
System.out.println("heap delta : " + ((after - before) / 1024 / 1024) + " MB"
|
||||
+ " <- the document is never held in memory");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user