磁盘支持的阵列列表

有时,您的列表可能会变得太大而无法容纳在内存中,因此您必须采取一些措施以避免内存不足。

做到这一点的正确方法是流传输–而不是将所有内容都放入内存中,您应该从源流传输数据并丢弃已经处理的条目。

但是,在某些情况下,您无法控制的代码需要一个List而您不能使用流式传输。 这些情况很少见,但万一击中它们,您必须找到解决方法。 一种是重新实现代码以与流一起使用,但是根据编写库的方式,可能无法实现。 因此,另一种选择是使用磁盘支持的列表–一个用作列表的列表,但在其下方存储和加载磁盘中的元素。

搜索现有的解决方案会产生3年以上的仓库,例如这个 , 这个和这个 。

然后是MapDB ,它很棒并且受支持。 它主要是关于地图的,但是它也支持List,如此处所示 。

最后,如果您只需要迭代而几乎不需要别的,则可以选择自己实现一些简单的事情。 我在这里做了– DiskBackedArrayList.java 。 它不支持很多东西(并非所有方法都被重写以引发异常,但是应该)。 但最重要的是,它不支持随机添加和随机获取,也不支持toArray()。 它纯粹是“填充收藏集”,然后“迭代收藏集”。 它依赖于ObjectOutputStream ,效率不是很高,但是易于使用。 请注意,在需要将少量数据添加到列表的情况下,我允许使用较短的内存prependList。

该列表将填充到内存中,直到达到指定的阈值,然后刷新到磁盘,清除内存,内存又开始被填充。 这也可能会更有效–在另一个线程中进行后台刷新,这不会干扰将元素添加到列表中,但是优化使事情变得复杂,在这种情况下,总运行时间不是问题。 最重要的是,重写iterator()方法以返回一个自定义迭代器,该迭代器首先流式传输前置列表,然后从磁盘读取所有内容,最后遍历仍在内存中的最新批处理。 最后,最后应调用clear()方法以关闭基础流。 可以在每次刷新时打开和关闭输出流,但是由于某些特定于首先写入标头的实现,因此不能在附加模式下使用ObjectOutputStream

因此,基本上,我们将流方法隐藏在List接口的下面–它仍在流元素并在不需要时将其丢弃。 理想情况下,应在数据源(例如数据库,消息队列等)上完成此操作,而不是将磁盘用作溢出空间,但是在某些情况下,使用磁盘很好。 此实现是一个起点,因为尚未在生产中进行测试,但是说明您可以根据需要使现有类适应不同的数据访问模式。

翻译自: https://www.javacodegeeks.com/2019/12/a-disk-backed-arraylist.html

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

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

相关文章

apache图片cache容量_apache利用mod_cache缓存图片等

一,引言以前我写过二篇有关图片,静态文件的缓存文章,一个是用varnish来缓存,一个用squid来缓存,apache当然也可以用来做图片,静态文件的缓存,下面我将详细说明一下,怎么完装和配置二…

艾特某人代码实现_Vue@某人,At某人,仿新浪微博@某人,@user,艾特,艾特某人...

atuser.vue展开更多群成员import getCaretCoordinates from textarea-caretexport default {props: {value: { //输入框初始值type: String,default: null},suffix: { //插入字符链接type: String,default: },loop: { //上下箭头循环type: Boolean,default: true},avoidEmail:…

spring batch_Spring Batch作为Wildfly模块

spring batch长期以来,Java EE规范缺少批处理API。 今天,这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念,尽管生…

h3c 链路聚合测试_良无磐石固,虚名复何益?- 链路聚合协议互通测试

一、描述链路聚合是将多条链路聚合在一起形成一个汇聚组,以实现负荷在各成员链路中的分担,同时也提供了更高的连接可靠性。Cisco的链路聚合有几种方式:手工、LACP(包括active和passive两种)、PAgP(Port-aggregation Protocol),其中…

Spring@懒惰注释

介绍: 默认情况下, Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中,我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中,我们…

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器,俗称行输出,它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中,底部引出各个绕组的引脚,高压输出采用高压引线直接送至显像管的…

西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...

病急不能乱投医!近日,一年一度、令人期待的——复旦版《2018年度中国医院排行榜(总榜)》全新揭晓了~这份榜单不仅是是中国医院学科建设的一个标杆也是大众疑难杂症寻找好医院的重要参考四川4家医院入百强!华西全国第二…

jit 和 jvm_关于JVM和JIT的一点点

jit 和 jvm如您所知,JVM(Java Virtusal Machine)使Java能够遵循“一次写入,随处运行”的范例。 JVM的核心包括以下组件: 堆 叠放 PermGen和方法区域 JIT编译器 代码缓存 堆是在应用程序代码开发阶段为您使用的每…

voxelnet_ue4商城资源Voxel Sandbox Toolkit体素沙盒工具箱

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Voxel Sandbox Toolkit体素沙盒工具箱体素沙盒工具箱是一个新的改进版本的体素生成从2016年适应4.22的需要。它用不同类型的立方体、树和拾取网格生成无限世界。因为额外的代码实现比以前的版本快得多。理想的创…

Pub / Sub本地模拟器

发布/订阅是GCP提供的不错的工具。 它非常方便,可以帮助您解决应用程序可能面临的消息传递难题。 实际上,如果您使用GCP,则可以使用托管消息解决方案。 如预期的那样,使用实际的发布/订阅解决方案需要一定的配额,因此…

mysql 写入随机字中文符_MySQL产生随机字符

MySQL产生随机字符UUID简介UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份…

mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

1,创建表时加入的约束a) 非空约束,not nullb) 唯一约束,uniquec) 主键约束,primary keyd) 外键约束,foreign key1,非空约束,针对某个字段设置其值不为空,如:学生的姓名不…

minecraft_MineCraft和堆外内存

minecraft总览 MineCraft是一个很好的例子,说明何时使用堆外内存确实可以提供帮助。 关键要求是: 保留的数据大部分是一个简单的数据结构(在Minecraft的情况下,其很多字节[]) 堆外内存的使用可以隐藏在抽象中。 考试…

win2008 mysql_mysql5.7.17在win2008R2的64位系统安装与配置实例

脚本之家已经给大家讲解过MYSQL其他版本在各种环境中的安装过程,大家可以参阅正文下面的相关文章,今天一起来学习下mysql5.7.17的实例安装教学,配置上稍微不同,希望能够帮助到你。安装MySql操作系统:Windows Server 20…

结构性错误

团队成员在使用以下代码时遇到了麻烦: void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, String targetUr…

mysql小计_使用SQL实现小计,合计以及排序_MySQL

bitsCN.com--说明:个人学习笔记,实现小计合计显示,分组按BANK_IDOP_DATE升序排序--测试数据CREATE TABLE #TB(ID VARCHAR(10),BANK_ID VARCHAR(10),OP_DATE VARCHAR(10),OPERATOR_NO VARCHAR(20),AMT DECIMAL(10,2))INSERT #TB SELECT 1111,0…

mysql函数封装_PHP访问MYSQL数据库封装类(附函数说明)

/*MYSQL 数据库访问封装类MYSQL 数据访问方式,php4支持以mysql_开头的过程访问方式,php5开始支持以mysqli_开头的过程和mysqli面向对象访问方式,本封装类以mysql_封装数据访问的一般流程:1,连接数据库 mysql_connect or mysql_pco…

mule和activemq_Mule ESB,ActiveMQ和DLQ

mule和activemq在本文中,我将展示一个简单的Mule ESB流程,以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例(如果没有,则可以在此处下载一个版本)。 在此示例中,我…

MySQL倒序如何避免filesort_如何避免mysql查询的filesort?

我用不同的参数使用这种查询:EXPLAIN SELECT SQL_NO_CACHE ilan_genel.id , ilan_genel.durum , ilan_genel.kategori , ilan_genel.tip , ilan_genel.ozellik , ilan_genel.m2 , ilan_genel.fiyat , ilan_genel.baslik , ilan_genel.ilce , ilan_genel.parabirimi …

在Java中键入Safe SQL

字符串,字符串,字符串 无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,最终都将SQL语句声明为Java String。 这种方法的问题在于,您必须为每个语句编写测试,以确保它甚至是有效的SQL。 没有编…