用jackson转json_用Jackson编写大JSON文件
用jackson转json
有时您需要将大量数据导出到JSON到文件中。 也许是“将所有数据导出到JSON”,或者是GDPR“可移植性的权利”,您实际上需要这样做。
与任何大型数据集一样,您不能只将其全部容纳在内存中并将其写入文件。 这需要一段时间,它会从数据库中读取大量条目,并且您需要注意不要使此类导出使整个系统超载或耗尽内存。
幸运的是,借助Jackson的SequenceWriter
和可选的管道流,这样做非常简单。 看起来像这样:
private ObjectMapper jsonMapper = new ObjectMapper();private ExecutorService executorService = Executors.newFixedThreadPool(5);@Asyncpublic ListenableFuture<Boolean> export(UUID customerId) {try (PipedInputStream in = new PipedInputStream();PipedOutputStream pipedOut = new PipedOutputStream(in);GZIPOutputStream out = new GZIPOutputStream(pipedOut)) {Stopwatch stopwatch = Stopwatch.createStarted();ObjectWriter writer = jsonMapper.writer().withDefaultPrettyPrinter();try(SequenceWriter sequenceWriter = writer.writeValues(out)) {sequenceWriter.init(true);Future<?> storageFuture = executorService.submit(() ->storageProvider.storeFile(getFilePath(customerId), in));int batchCounter = 0;while (true) {List<Record> batch = readDatabaseBatch(batchCounter++);for (Record record : batch) {sequenceWriter.write(entry);}}// wait for storing to completestorageFuture.get();} logger.info("Exporting took {} seconds", stopwatch.stop().elapsed(TimeUnit.SECONDS));return AsyncResult.forValue(true);} catch (Exception ex) {logger.error("Failed to export data", ex);return AsyncResult.forValue(false);}}
该代码可以做一些事情:
- 使用SequenceWriter连续写入记录。 它使用OutputStream初始化,所有内容均写入其中。 这可以是简单的FileOutputStream,也可以是如下所述的管道流。 注意,这里的命名有点误导–
writeValues(out)
听起来就像您在指示编写者现在写东西; 而是将其配置为以后使用特定的流。 SequenceWriter
用true
初始化,表示“包装在数组中”。 您正在编写许多相同的记录,因此它们应在最终JSON中表示一个数组。- 使用
PipedOutputStream
和PipedInputStream
将SequenceWriter
链接到InputStream
,然后将InputStream
传递到存储服务。 如果我们明确地使用文件,则不需要这样做-只需传递FileOutputStream
就可以。 但是,您可能想要以不同的方式存储文件,例如在Amazon S3中,并且putObject调用需要一个InputStream,从该InputStream可以读取数据并将其存储在S3中。 因此,实际上,您正在写入一个OutputStream,而该OutputStream会直接写入InputStream,当被输入以读取该输入流时,会将所有内容写入另一个OutputStream - 存储文件是在单独的线程中调用的,因此写入文件不会阻塞当前线程,当前线程的目的是从数据库中读取数据。 同样,如果使用简单的FileOutputStream,则不需要这样做。
- 整个方法被标记为@Async(spring),因此它不会阻止执行-它被调用并在准备就绪时完成(使用内部Spring executor服务和有限的线程池)
- 这里未显示数据库批处理读取代码,因为它随数据库的不同而不同。 关键是,您应该分批提取数据,而不是SELECT * FROMX。
- OutputStream包装在GZIPOutputStream中,因为带有重复元素的JSON之类的文本文件可从压缩中显着受益
主要工作是由Jackson的SequenceWriter完成的,(显而易见的)要点是–不要假设您的数据适合内存。 它几乎永远不会做,所以批量处理和增量写入都是如此。
翻译自: https://www.javacodegeeks.com/2018/08/writing-big-json-files-jackson.html
用jackson转json
用jackson转json_用Jackson编写大JSON文件相关推荐
- Atitit 大json文件的结构化查看解决方案,高性能的jsonview attilax总结.docx
Atitit 大json文件的结构化查看解决方案,高性能的jsonview attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonob ...
- 大(json)文件压缩(minify)
文章目录 Preface 解决方案 Preface 现在在做一个 GIS 地图的项目, 做过地图的应该就知道各省/市/县的json文件有多大(大部分都是经纬度数据), 就直接放前台public目录下了 ...
- 用Jackson编写大型JSON文件
有时您需要将大量数据导出到JSON到文件中. 可能是"将所有数据导出到JSON",或者是GDPR"可移植性权利",您实际上需要这样做. 与任何大型数据集一样,您 ...
- python逐行读取json_如何用python读取json文件里指定的数据
JSON文件who.json内容如下:{"name":"mss","version":"1.0.0","des ...
- 安卓大json文件解析_安卓解析 json 4种格式 全解析
1 简单的一个 { ,,,,} 2 里面有数组 { , [{,,},{,,}],} 3 直接一个数组 4 数组里有数组 5 其他情况? 没有吧,除非json格式不规范 主代码: package ...
- java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...
java+解析未知json 使用Jackson API在Java中解析JSON时的常见问题之一是,当您的JSON包含未知属性(即您的Java类没有对应于所有JSON属性的所有字段)时,该操作将失败. ...
- Jackson学习二之集合类对象与JSON互相转化--转载
原文地址:http://lijingshou.iteye.com/blog/2003059 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换. package com.j ...
- 怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神
用c语言编写大整数的四则运算,求大神 答案:3 信息版本:手机版 解决时间 2019-10-03 17:13 已解决 2019-10-03 01:32 用c语言编写大整数的四则运算,求大神 最佳答案 ...
- java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件
java编写大数据分析模型 Earlier we learned how to read XML file and how to edit XML file in java using DOM Par ...
最新文章
- redis安装教程 windows环境
- ThreadPoolExecutor的execute源码分析
- Python Cookbook手记I
- NonEmpty和Hierarchize嵌套的bug
- 捕鱼小游戏html源码,html5捕鱼达人小游戏源码
- 最佳75个安全工具介绍及其下载地址
- 软件测试之 app测试的工具汇总
- SQLmap简单的使用——新手教程解析
- FPS通用的方框透视公式的原理
- 微信服务号如何创建一个带参数的微信二维码?
- 制作一个类“全能扫描王”的简易扫描软件(opencv)
- 电路交换、报文交换、分组交换三种数据交换方式的特点、优点、应用场景以及技术对比分析
- python random.round 修约方法 4舍6入5看齐,奇进偶不进
- JS 逆向之 Hook
- CSP M4 B ZJM要抵御宇宙射线
- 电脑组成部件介绍图解之电脑由哪些部件组成?各个部件作用又是什么 ?主要功能是什么?
- Matlab语音信号去噪程序,使用低通巴特沃斯滤波器
- UVA:10118 Free Candies
- 从《我不是药神》说起
- 如何将竖屏视频转换为横屏,横屏转为竖屏