用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中表示一个数组。
  • 使用PipedOutputStreamPipedInputStreamSequenceWriter链接到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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博弈论学科整体概览

一、博弈论的概念 博弈论又被称为对策论&#xff08;Game Theory&#xff09;既是现代数学的一个新分支&#xff0c;也是运筹学的一个重要学科。博弈论主要研究公式化了的激励结构间的相互作用。是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行…

linux 进程组id 错乱,【Linux】终端,进程组,作业,会话及作业控制

终端概念在UNIX系统中,用用户通过终端登录系统后得到一一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况 下(没有重定向)…

纳什均衡

纳什均衡&#xff08;或者纳什平衡&#xff09;&#xff0c;Nash equilibrium ,又称为非合作博弈均衡&#xff0c;是博弈论的一个重要策略组合&#xff0c;以约翰纳什命名。 定义 经济学定义 数学定义 纳什均衡的定义&#xff1a;在博弈G﹛S1,…,Sn&#xff1a;u1,…&#x…

linux 添加本地源,linux 添加本地yum源

1、yum repolist2、https://opsx.alibaba.com/mirror&#xff0c;首先下在该镜像站点中的yum&#xff0c;这里选择epel源epel-release-latest-7.noarch.rpm3、rpm -ivh epel-release-latest-7.noarch.rpm # 安装源4、此时看到epel源已经安装好了&#xff0c;如果我们不适用bas…

稳定婚姻问题:Gale–Shapley算法

&#xff08;一&#xff09;问题的引出 在组合数学、经济学、计算机科学中&#xff0c;稳定婚姻问题&#xff08;英语&#xff1a;stable marriage problem&#xff0c;简称SMP&#xff09;又称为稳定配对问题&#xff08;stable matching problem&#xff09;&#xff0c;是指…

Linux程序设计实验项目六,《linux程序设计》实验教学大纲

《linux程序设计》实验教学大纲课程名称&#xff1a;Linux程序设计课程编号&#xff1a;408412420408436407适用专业&#xff1a;计算机科学与技术网络工程软件工程总 学 分&#xff1a;3总 学 时&#xff1a;48其中实验学时16一、实验课程性质、目的与任务《Linux程序设计》课…

宣布EAXY:使Java中的XML更容易

Java中的XML库是一个雷区。 操作和读取XML所需的代码量令人震惊&#xff0c;使用不同的库遇到类路径问题的风险很大&#xff0c;并且对名称空间的处理带来许多混乱和错误。 最糟糕的是&#xff0c;情况似乎并没有改善。 一位同事让我意识到JOOX库。 这是解决这些问题的一个很好…

奇异值分解(SVD)原理与在降维中的应用

奇异值分解 奇异值分解(Singular Value Decomposition&#xff0c;以下简称SVD)是在机器学习领域广泛应用的算法&#xff0c;它不光可以用于降维算法中的特征分解&#xff0c;还可以用于推荐系统&#xff0c;以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的…

嵌套类和私有方法

当您在另一个类中有一个类时&#xff0c;他们可以看到彼此的private方法。 在Java开发人员中并不为人所知。 面试中的许多候选人说&#xff0c; private是一种可见性&#xff0c;它使代码可以查看成员是否属于同一班级。 这实际上是对的&#xff0c;但是更准确地说&#xff0c;…

linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc

[计算机]Linux 信号signal处理机制Linux 信号signal处理机制信号是Linux编程中非常重要的部分&#xff0c;本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号&#xff0c;以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法…

自相关函数与互相关函数

1 概念 1 自相关函数 2 互相关函数 从定义式中可以看到&#xff0c;互相关函数和卷积运算类似&#xff0c;也是两个序列滑动相乘&#xff0c;但是区别在于&#xff1a;互相关的两个序列都不翻转&#xff0c;直接滑动相乘&#xff0c;求和&#xff1b;卷积的其中一个序列需要先…

Linux as4开启telnet,linux as4 虚拟机 上开启 telnet 和ssh 和 ftp 服务

1.telnet服务开启(1)输入[rootrehat ~]# chkconfig krb5-telnet --listkrb5-telnet on这是你的服务存在的状态&#xff0c;如果没有的话&#xff0c;可能是你的telnet名字和我的不一样&#xff0c;也可能是你的那个rpm包没有安装。我第一次的Linux中是没有安装的&#xff0…

解决MATLAB不能设置为.m文件默认打开方式

转载&#xff1a;https://blog.csdn.net/yujiaerzong/article/details/77624167 将下面代码复制保存为 associateFiles.m 文件。 或者从下面链接下载文件https://ww2.mathworks.cn/matlabcentral/fileexchange/51165-matlab-file-association-fix 在MATLAB中运行 associateFil…

linux 我的世界 跨平台联机,我的世界跨平台联机 PC、手机等平台数据互通

我的世界 ( MineCraft&#xff0c;简称 MC ) 》是一款开放世界沙盒建造游戏&#xff0c;有着超高的自由度&#xff0c;在国内外有着相当高的人气&#xff0c;各年龄层的玩家都非常的喜欢玩。在这次 E3 2017 微软展前发布会上&#xff0c;微软除了公布新主机 Xbox One X ( 原名 …

展望Java的未来:空值类型

尽管有前途的Java值类型不是迫在眉睫&#xff0c;但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下&#xff0c;以了解事情的进展情况并了解即将发生的事情。 诚然&#xff0c;由于我对所用术语的了解有限&#xff0c;并且其中某些消息的底层细节&#xff0c;使我无法…

5G的场景、需求、通信速率

5G三大典型场景 5G有三大典型场景&#xff0c;这三大场景描述了5G的需求也反应了5G与4G的不同&#xff0c;如图所示&#xff0c;三大场景分别为&#xff1a;增强型移动宽带通信&#xff08;eMBB&#xff09;&#xff0c;大规模机器型通信&#xff08;eMTC&#xff09;和超高可…

fceux模拟器linux,超强FC模拟器fceux-2.2.3最新版

超强FC模拟器fceux-2.2.3最新版fceux一款超好用的FC模拟器软件&#xff0c;这个是最新版本的fceux-2.2.3-win32.zip较之早前版本&#xff0c;2.2.2 版本修正部分 bug 并添加了新功能&#xff0c;主要是调试和逆向编译工程的功能。较之早前版本&#xff0c;2.2.1 版本修正大量 b…

linux7禁用ipv6,RHEL 7 及 CentOS 7 彻底禁用IPv6的方法

原标题&#xff1a;RHEL 7 及 CentOS 7 彻底禁用IPv6的方法IPv6在未来可能成为主流&#xff0c;但是就目前而言&#xff0c;很多软件对IPv6的支持并不是很完善&#xff0c;可能导致各类问题。RHEL 7 & CentOS 7 在启动时默认是加载IPv6相关模块的&#xff0c;而禁用IPV6的方…

jpa 分页 排序 过滤_使用JPA标准@ViewScoped通过分页,过滤和排序进行Primefaces DataTable延迟加载...

jpa 分页 排序 过滤Primefaces数据表惰性分页有效&#xff0c;但是在Web上使用Criteria搜索完整示例后&#xff0c;我感到非常沮丧。 所以我混合了来自 http://stackoverflow.com/questions/13972193/how-to-query-data-for-primefaces-datatable-with-lazy-loading-and-pagin…

通信中的backhaul

backhaul 可以翻译成回程,也叫回程线路在现有的无线通信中,backhaul指的是基站和基站控制器之间的链接(一般用户先接入基站,基站再与基站控制器通信,然后进入核心网)。在无线技术中&#xff0c;回程&#xff08;backhaul&#xff09;指的是从信元站点向交换机传送语音和数据流量…