使用内存映射提高BufferedRandoAccessFile性能(测试可用)

简介: 使用内存映射提高BufferedRandoAccessFile性能(测试可用)

网上搜索了代码:


使用byte数组缓冲的,不能用。

如何使用内存映射,没有可用代码。

 只好自己研究,先从简单的开始。目前还将就着能用。


package quantum6;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public final class BufferedRandomAccessFile extends RandomAccessFile
{
    private static final  int BUFFER_SIZE = 1024*1024;
    private String filePath;
    private int outSize = BUFFER_SIZE;
    private MappedByteBuffer mbbi;
    private MappedByteBuffer mbbo;
    public BufferedRandomAccessFile(File file, String mode) throws FileNotFoundException
    {
        this(file, mode, file.length());
    }
    public BufferedRandomAccessFile(File file, String mode, long size) throws FileNotFoundException
    {
        super(file, mode);
        filePath = file.getAbsolutePath();
        try
        {
            if (mode.contains("r"))
            {
                FileChannel fci = getChannel();
                mbbi = fci.map(FileChannel.MapMode.READ_ONLY,  0, size);
            }
            if (mode.contains("w"))
            {
                FileChannel fco = getChannel();
                mbbo = fco.map(FileChannel.MapMode.READ_WRITE, 0, size);
            }
            init(file.length());
        }
        catch (IOException e)
        {
            throw new FileNotFoundException();
        }
    }
    private void init(long size) throws IOException
    {
        /*
        bufferOffsetLeft  = 0;
        bufferOffsetRight = size;
        bufferPointer = 0;
        bufferSize = (int)(size > BUFFER_SIZE ? size : BUFFER_SIZE);
        bufferData = new byte[bufferSize];
        */
    }
    public String getPath()
    {
        return filePath;
    }
    @Override
    public void seek(long pos) throws IOException
    {
        mbbi.position((int)pos);
    }
    @Override
    public int read() throws IOException
    {
        return mbbi.get();
    }
    @Override
    public int read(byte[] b) throws IOException
    {
        return this.read(b, 0, b.length);
    }
    @Override
    public int read(byte[] b, int off, int len) throws IOException
    {
        int left = mbbi.remaining();
        mbbi.get(b, off, len);
        return (mbbi.remaining() - left);
    }
    private void checkWriteBuffer()  throws IOException
    {
        if (mbbo == null || !mbbo.hasRemaining())
        {
            outSize += BUFFER_SIZE;
            FileChannel fco = getChannel();
            mbbo = fco.map(FileChannel.MapMode.READ_WRITE, 0, outSize);
        }
    }
    @Override
    public void write(int b) throws IOException
    {
        checkWriteBuffer();
        mbbo.put((byte)b);
    }
    @Override
    public void write(byte[] b) throws IOException
    {
        this.write(b, 0, b.length);
    }
    @Override
    public void write(byte[] b, int off, int len) throws IOException
    {
        checkWriteBuffer();
        mbbo.put(b, off, len);
    }
}
目录
相关文章
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
397 4
|
10月前
|
存储 缓存 网络协议
阿里云内存型实例规格性能、价格、适用场景与选型指南参考
阿里云服务器ECS(Elastic Compute Service)提供了多样化的内存型实例规格族,专为需要高性能内存资源的应用场景设计。从最新的r8a系列到经过优化的re6p系列,阿里云内存型实例旨在提供稳定、高效且安全的计算环境。这些实例不仅具备强大的计算性能与内存配比,还通过支持ESSD云盘和高效网络协议,显著提升了存储I/O能力和网络带宽,适用于大数据分析、高性能数据库、内存密集型应用等多种场景。本文将详细解析阿里云ECS中的多个内存型实例规格族,包括它们的核心特点、适用场景、实例规格及具体指标数据,为用户在选型时提供参考。
阿里云内存型实例规格性能、价格、适用场景与选型指南参考
|
6月前
|
测试技术 UED 开发者
性能测试报告-用于项目的性能验证、性能调优、发现性能缺陷等应用场景
性能测试报告用于评估系统性能、稳定性和安全性,涵盖测试环境、方法、指标分析及缺陷优化建议,是保障软件质量与用户体验的关键文档。
|
6月前
|
消息中间件 存储 关系型数据库
千亿消息“过眼云烟”?Kafka把硬盘当内存用的性能魔法,全靠这一手!
Apache Kafka 是由 LinkedIn 开发并捐赠给 Apache 基金会的分布式消息队列系统,具备高吞吐、可扩展和容错能力。其核心设计围绕主题、分区、分段和偏移量展开,通过顺序写入磁盘和 Page Cache 提升性能,广泛应用于大数据实时处理场景。
277 0
|
9月前
|
存储 缓存 分布式计算
高内存场景必读!阿里云r7/r9i/r8y/r8i实例架构、性能、价格多维度对比
阿里云针对高性能需求场景,一般会在活动中推出内存型r7、内存型r9i、内存型r8y和内存型r8i这几款内存型实例规格的云服务器。相比于活动内的经济型e和通用算力型u1等实例规格,这些内存型实例在性能上更为强劲,尤其适合对内存和计算能力有较高要求的应用场景。这些实例规格的云服务器在处理器与内存的配比上大多为1:8,但它们在处理器架构、存储性能、网络能力以及安全特性等方面各有千秋,因此适用场景也各不相同。本文将为大家详细介绍内存型r7、r9i、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
弹性计算 安全 数据库
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
作为云计算服务核心组件,虚拟化内存管理直接影响业务系统性能表现。本文详解了内存优化方案与技术实践,助您降低30%资源浪费。
325 0
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
|
8月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
1052 0
|
10月前
|
存储 分布式计算 安全
阿里云服务器内存型实例怎么选?r7/r8y/r8i实例性能、适用场景与选择参考
在选择阿里云服务器时,针对内存密集型应用和数据库应用,内存型实例因其高内存配比和优化的性能表现,成为了众多用户的热门选择。在目前阿里云的活动中,内存型实例主要有内存型r7、内存型r8y和内存型r8i实例可选。为了帮助大家更好地了解这三款实例的区别,本文将详细对比它们的实例规格、CPU、内存、计算、存储、网络等方面的性能,并附上活动价格对比,以便用户能够全面了解它们之间的不同,以供选择和参考。
|
9月前
|
存储 缓存 数据挖掘
阿里云服务器实例选购指南:经济型、通用算力型、计算型、通用型、内存型性能与适用场景解析
当我们在通过阿里云的活动页面挑选云服务器时,相同配置的云服务器通常会有多种不同的实例供我们选择,并且它们之间的价格差异较为明显。这是因为不同实例规格所采用的处理器存在差异,其底层架构也各不相同,比如常见的X86计算架构和Arm计算架构。正因如此,不同实例的云服务器在性能表现以及适用场景方面都各有特点。为了帮助大家在众多实例中做出更合适的选择,本文将针对阿里云服务器的经济型、通用算力型、计算型、通用型和内存型实例,介绍它们的性能特性以及对应的使用场景,以供大家参考和选择。