使用分页方式读取超大文件的性能试验

合集下载

请求分页实验报告

请求分页实验报告

一、实验目的1. 理解请求分页的基本原理和实现方法。

2. 掌握操作系统内存管理的基本知识。

3. 提高编程能力和系统设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio 2019三、实验原理请求分页是一种内存管理策略,其基本思想是当进程访问内存中的某页时,如果该页不在内存中,则从磁盘读取该页到内存,并将内存中的一部分页调出磁盘。

请求分页可以提高内存的利用率,避免内存碎片。

四、实验内容1. 设计请求分页系统2. 实现请求分页算法3. 测试请求分页系统的性能五、实验步骤1. 设计请求分页系统(1)定义数据结构定义进程结构体、内存块结构体、页面表结构体等。

(2)初始化系统初始化内存块、页面表、进程队列等。

(3)请求分页算法实现实现FIFO、LRU、LFU等请求分页算法。

2. 实现请求分页算法(1)FIFO算法FIFO(先进先出)算法是最简单的请求分页算法,当请求分页时,总是选择最先进入内存的页面调出。

(2)LRU算法LRU(最近最少使用)算法选择最近最少被访问的页面调出,可以有效减少缺页中断。

(3)LFU算法LFU(最少使用频率)算法选择使用频率最低的页面调出,适用于页面使用频率不均匀的情况。

3. 测试请求分页系统的性能(1)定义测试用例设计一系列测试用例,包括不同大小的进程、不同类型的页面访问模式等。

(2)运行测试用例运行测试用例,记录缺页中断次数、页面命中率等性能指标。

(3)分析结果分析测试结果,比较不同请求分页算法的性能。

六、实验结果与分析1. 实验结果通过实验,我们得到了以下结果:(1)FIFO算法:缺页中断次数为50,页面命中率为90%。

(2)LRU算法:缺页中断次数为30,页面命中率为95%。

(3)LFU算法:缺页中断次数为35,页面命中率为92%。

2. 分析结果从实验结果可以看出,LRU算法在三种算法中性能最好,其次是LFU算法,FIFO算法性能最差。

分布式文件系统的可扩展性与性能测试方法

分布式文件系统的可扩展性与性能测试方法

分布式文件系统的可扩展性与性能测试方法摘要:分布式文件系统是一个由多个节点组成的系统,用于存储和管理大量的文件。

在实际应用中,可扩展性和性能是分布式文件系统的两个关键指标。

本文将重点讨论分布式文件系统的可扩展性和性能测试方法,并分析其原理和优缺点。

一、引言随着数据量的不断增长,传统的单机文件系统已经无法满足存储和管理大量文件的需求。

分布式文件系统应运而生,通过将数据分散存储在多个节点上,提供了更高的可扩展性和性能。

在设计和实现分布式文件系统时,了解其可扩展性和性能是必不可少的。

二、可扩展性测试方法可扩展性是衡量分布式文件系统能否适应不断增长的数据量和用户访问量的能力。

下面介绍几种常见的可扩展性测试方法。

1. 负载测试负载测试是一种通过向系统注入大量负载以测试其性能的方法。

在可扩展性测试中,我们可以通过逐渐增加节点数量或增加数据量来模拟不断增长的负载。

通过监测系统的响应时间和吞吐量,我们可以评估分布式文件系统在不同负载下的可扩展性。

2. 弹性测试弹性测试是一种测试系统在增加或减少节点时的可扩展性的方法。

通过动态增加或减少节点的数量,并观察系统的性能表现,我们可以评估分布式文件系统在节点扩展或缩减时的表现。

3. 容量测试容量测试是一种测试分布式文件系统在不断增加数据量时的可扩展性的方法。

通过逐步增加数据量,我们可以评估系统在不同数据量下的性能表现,以确定系统的可扩展性。

三、性能测试方法性能测试是衡量分布式文件系统的运行效率和吞吐量的方法。

下面介绍几种常见的性能测试方法。

1. 带宽测试带宽测试是一种测试分布式文件系统在某个时间段内的传输速率的方法。

通过向系统注入特定大小的文件并计算传输所需的时间,我们可以评估系统的带宽性能。

2. 响应时间测试响应时间测试是一种测试分布式文件系统对用户请求的响应时间的方法。

通过模拟用户请求并测量系统响应时间,我们可以评估系统的实时性能和用户体验。

3. 并发测试并发测试是一种测试分布式文件系统在多个用户同时访问的情况下的性能的方法。

实现大文件读取的原理-概述说明以及解释

实现大文件读取的原理-概述说明以及解释

实现大文件读取的原理-概述说明以及解释1.引言1.1 概述引言部分是文章的开头,用来介绍文章的背景和大致内容。

在编写概述部分的内容时,可以包括以下信息:概述部分应该对大文件读取的问题进行简要描述。

大文件读取是指针对文件大小很大的情况下,有效地读取其中的数据内容。

随着科技的不断进步和数据量的爆炸增长,大文件的读取问题变得日益重要。

本文将探讨大文件读取的原理。

首先,我们将介绍大文件读取的挑战,包括读取速度慢、内存占用高等问题。

随后,我们将介绍一种解决方案——分块读取的原理和优势。

通过将大文件划分为多个小块进行读取,可以有效提高读取速度和降低内存占用。

最后,我们将总结大文件读取的原理,并展望未来的发展方向。

通过本文的阐述,读者将可以深入了解大文件读取的原理,以及分块读取在解决大文件读取问题中的作用。

这对于开发人员和数据分析师来说都具有重要意义,可以帮助他们更高效地处理大文件数据。

请注意,以上仅为概述部分的示例内容,您需要根据实际情况进行适当修改和扩展。

文章结构是指文章的组织框架,包括引言、正文和结论等部分。

通过合理的结构安排,可以使文章逻辑清晰、条理分明、易于阅读和理解。

本文的结构如下:1. 引言1.1 概述:简要介绍大文件读取的背景和重要性,引起读者的兴趣。

1.2 文章结构:介绍文章的整体结构和各部分的内容,为读者提供阅读指导。

1.3 目的:明确本文的目的,即探讨大文件读取的原理。

2. 正文2.1 大文件读取的挑战:详细讨论大文件读取所面临的困难和挑战,包括存储空间、读取速度和性能等方面。

2.2 分块读取的原理和优势:阐述分块读取大文件的原理和工作机制,介绍分块读取的优势,如节省内存空间、提高读取效率等。

3. 结论3.1 总结大文件读取的原理:对分块读取的原理和优势进行总结和归纳,强调其重要性和应用前景。

3.2 展望未来的发展方向:展望大文件读取技术的未来发展方向,提出可能的改进和创新方向,以及对相关领域的启示和影响。

大文件读取解决方案

大文件读取解决方案

大文件读取解决方案1.分块读取:将文件分割为多个块进行读取。

可以设置一个固定的块大小,逐步读取每个块的数据。

这种方法适用于文件无序的情况,但需要借助文件指针进行定位。

2.缓存读取:使用缓冲区来存储部分文件内容,通过循环读取小块数据并累计存储在缓冲区中。

随着缓冲区的数据被处理完,再读取下一块数据。

这种方法可以减少内存的占用,提高读取效率。

3. 内存映射文件:通过将文件映射到内存中,可以像访问内存一样访问文件内容。

可以使用mmap函数(在Linux环境下)或CreateFileMapping函数(在Windows环境下)将文件映射到内存中,并使用指针进行操作和读取。

4.多线程读取:将文件分割为多个部分,每个线程负责读取一个部分的数据。

可以有效利用多核处理器的并行能力,提高读取速度。

需要注意进行线程同步和数据合并。

5.压缩文件读取:如果文件内容可以压缩,可以先将文件进行压缩处理,然后在读取时进行解压缩操作。

这样可以减小文件大小,提高读取效率。

6.使用流处理:使用流来逐行读取文件内容,而不是一次性读取整个文件。

这种方法可以减少内存的占用,并且适用于处理大文件中的一行或一部分内容。

7.使用数据库:将文件内容导入数据库,然后通过数据库的查询语句进行读取操作。

数据库可以有效地管理大量数据,并提供高效的查询功能。

8. 使用专业的大文件读取工具:一些专门为大文件读取设计的工具,例如Hadoop、Spark等,可以处理大规模的数据集,并提供高性能的文件读取能力。

在选择解决方案时,需要考虑文件的具体情况和应用需求。

不同的解决方案适用于不同的场景,可以根据实际情况选择最合适的方法。

同时,也可以结合多种方法进行优化和改进,以提高大文件读取的效率和可靠性。

数据量很大,分页查询很慢,优化方案

数据量很大,分页查询很慢,优化方案

数据量很⼤,分页查询很慢,优化⽅案参考⽂章:当需要从数据库查询的表有上万条记录的时候,⼀次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使⽤分页查询。

对于数据库分页查询,也有很多种⽅法和优化的点。

下⾯简单说⼀下我知道的⼀些⽅法。

准备⼯作为了对下⾯列举的⼀些优化进⾏测试,下⾯针对已有的⼀张表进⾏说明。

1、表名:order_history2、描述:某个业务的订单历史表3、主要字段:unsigned int id,tinyint(4) int type4、字段情况:该表⼀共37个字段,不包含text等⼤型数据,最⼤为varchar(500),id字段为索引,且为递增。

5、数据量:57092946、MySQL版本:5.7.16线下找⼀张百万级的测试表可不容易,如果需要⾃⼰测试的话,可以写shell脚本什么的插⼊数据进⾏测试。

以下的 sql 所有语句执⾏的环境没有发⽣改变,下⾯是基本测试结果:select count(*) from orders_history;返回结果:5709294三次查询时间分别为:8903 ms8323 ms8401 ms⼀般分页查询⼀般的分页查询使⽤简单的 limit ⼦句就可以实现。

limit ⼦句声明如下:select * from table LIMIT [offset,] rows | rows OFFSET offsetLIMIT ⼦句可以被⽤于指定 SELECT 语句返回的记录数。

需注意以下⼏点:1、第⼀个参数指定第⼀个返回记录⾏的偏移量,注意从 0开始2、第⼆个参数指定返回记录⾏的最⼤数⽬3、如果只给定⼀个参数:它表⽰返回最⼤的记录⾏数⽬4、第⼆个参数为 -1 表⽰检索从某⼀个偏移量到记录集的结束所有的记录⾏5、初始记录⾏的偏移量是 0(⽽不是 1)下⾯是⼀个应⽤实例:select * from orders_history where type = 8 limit 1000,10;该条语句将会从表 orders_history 中查询 offset:1000开始之后的10条数据,也就是第1001条到第1010条数据( 1001<=id<=1010)。

大文件读取解决方案

大文件读取解决方案

大文件读取解决方案在处理大文件读取的过程中,主要涉及到以下几个方面的问题:文件大小、内存限制、IO性能以及文件格式等。

针对这些问题,可以采取以下解决方案:1.分块读取:将大文件切割为多个小块进行读取和处理。

通过逐块读取文件可以一定程度上减少内存的使用量。

可以使用文件指针定位到需要读取的位置,然后读取指定大小的数据块。

2. 使用缓冲区:在读取大文件时,可以利用缓冲区来减少IO次数,从而提高IO性能。

可以使用缓冲流(BufferedReader、BufferedInputStream等)进行读取,设定合理的缓冲区大小,以提高读取效率。

3.多线程读取:在多核CPU上可以使用多线程并行读取文件,提高读取速度。

将文件切割成多个块,并使用多个线程同时读取和处理。

可以利用线程池来管理线程的创建和销毁,控制并发数,避免资源浪费和线程频繁切换的开销。

4. 内存映射文件:通过使用内存映射文件,将大文件映射到内存中,可以直接在内存中进行读取操作,避免频繁的IO操作。

内存映射文件可以使用NIO中的FileChannel类的map(方法来实现。

5.使用外部存储:如果内存不能完全加载大文件,可以考虑使用外部存储进行读取和处理,如数据库等。

可以将大文件拆分为小文件,存储在数据库中,再进行读取和处理,减少内存的压力。

6.改变文件格式:如果可能的话,可以考虑改变文件的格式,减小文件的大小。

例如,可以使用压缩算法对文件进行压缩,减小文件的体积,然后再解压缩进行读取和处理。

7. 使用专用的文件处理工具:可以使用专门的大文件处理工具,如Hadoop、Spark等,这些工具提供了分布式处理的能力,可以将大文件划分为多个块,分发到不同的节点上进行处理,大大加快处理速度。

8.增加硬件资源:如果处理大文件的性能问题持续存在,可以考虑增加硬件资源,如更大的内存、更快的磁盘等,以提升读取和处理性能。

总结起来,大文件读取需要综合考虑文件大小、内存限制、IO性能和文件格式等因素,可以采取分块读取、使用缓冲区、多线程读取、内存映射文件等方式来解决问题。

java分批次读取大文件的三种方法

java分批次读取大文件的三种方法

java分批次读取⼤⽂件的三种⽅法1. java 读取⼤⽂件的困难java 读取⽂件的⼀般操作是将⽂件数据全部读取到内存中,然后再对数据进⾏操作。

例如Path path = Paths.get("file path");byte[] data = Files.readAllBytes(path);这对于⼩⽂件是没有问题的,但是对于稍⼤⼀些的⽂件就会抛出异常Exception in thread "main" ng.OutOfMemoryError: Required array size too largeat java.nio.file.Files.readAllBytes(Files.java:3156)从错误定位看出,Files.readAllBytes ⽅法最⼤⽀持 Integer.MAX_VALUE - 8 ⼤⼩的⽂件,也即最⼤2GB的⽂件。

⼀旦超过了这个限度,java 原⽣的⽅法就不能直接使⽤了。

2. 分次读取⼤⽂件既然不能直接全部读取⼤⽂件到内存中,那么就应该把⽂件分成多个⼦区域分多次读取。

这就会有多种⽅法可以使⽤。

(1) ⽂件字节流对⽂件建⽴ java.io.BufferedInputStream ,每次调⽤ read() ⽅法时会接连取出⽂件中长度为 arraySize 的数据到 array 中。

这种⽅法可⾏但是效率不⾼。

import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.IOException;/*** Created by zfh on 16-4-19.*/public class StreamFileReader {private BufferedInputStream fileIn;private long fileLength;private int arraySize;private byte[] array;public StreamFileReader(String fileName, int arraySize) throws IOException {this.fileIn = new BufferedInputStream(new FileInputStream(fileName), arraySize);this.fileLength = fileIn.available();this.arraySize = arraySize;}public int read() throws IOException {byte[] tmpArray = new byte[arraySize];int bytes = fileIn.read(tmpArray);// 暂存到字节数组中if (bytes != -1) {array = new byte[bytes];// 字节数组长度为已读取长度System.arraycopy(tmpArray, 0, array, 0, bytes);// 复制已读取数据return bytes;}return -1;}public void close() throws IOException {fileIn.close();array = null;}public byte[] getArray() {return array;}public long getFileLength() {return fileLength;}public static void main(String[] args) throws IOException {StreamFileReader reader = new StreamFileReader("/home/zfh/movie.mkv", 65536);long start = System.nanoTime();while (reader.read() != -1) ;long end = System.nanoTime();reader.close();System.out.println("StreamFileReader: " + (end - start));}}(2) ⽂件通道对⽂件建⽴ java.nio.channels.FileChannel ,每次调⽤ read() ⽅法时会先将⽂件数据读取到分配的长度为 arraySize 的 java.nio.ByteBuffer 中,再从中将已经读取到的⽂件数据转化到 array 中。

linux中分页查看文件内容的命令

linux中分页查看文件内容的命令

linux中分页查看文件内容的命令1.引言1.1 概述引言是一篇文章的开端,用于介绍文章的背景和目的。

在本篇长文中,我们将探讨Linux中分页查看文件内容的命令。

在Linux系统中,我们经常需要处理大型文件的内容,而分页查看文件可以使我们更方便地阅读和分析文件内容。

本文将介绍分页查看文件内容的需求以及相应的命令。

首先,我们将详细探讨为什么我们需要在Linux系统中进行分页查看文件内容,以及在什么情况下需要使用这些命令。

其次,我们将介绍几个常用的分页查看文件内容的命令,例如"more"和"less"命令。

我们将详细介绍它们的使用方法以及它们的特点和区别。

最后,我们将总结这些分页查看文件内容的命令,并提供一些建议来帮助读者更好地使用这些命令。

我们将讨论如何选择合适的命令来满足不同的需求,并提供一些额外的技巧和技巧来提高工作效率。

通过本文的阅读,读者将能够更全面地了解在Linux系统中分页查看文件内容的命令,并能够有效地应用它们来处理文件。

无论是日常文件阅读还是日志分析,分页查看文件内容的命令都将成为您重要的工具之一。

1.2 文章结构本文主要分为引言、正文和结论三个部分。

引言部分将概述本文的内容,并介绍文章的结构和目的。

正文部分将重点讨论Linux中分页查看文件内容的需求,并介绍常用的分页查看文件内容的命令。

结论部分将对文章进行总结,总结分页查看文件内容的命令,并提出使用建议。

通过以上结构,读者能够清晰地了解文章的组织结构,便于系统地学习和理解Linux中分页查看文件内容的命令。

1.3 目的本文的目的是介绍在Linux系统中如何使用分页查看文件内容的命令。

当我们在Linux终端中打开一个大型文件时,文件的内容可能会超过终端窗口的显示范围,导致我们无法完整地阅读文件的全部内容。

因此,我们需要一种能够将文件内容按照一页一页显示的方法来浏览的工具或命令。

在Linux中,有几个常用的命令可以满足我们的需求,比如`less`、`more`和`head`等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用分页方式读取超大文件的性能试验
(注:本文使用FileStream类的Seek()和Read()方法完成文件读取,未使用特别读取方式。


我们在编程过程中,经常会和计算机文件读取操作打交道。

随着计算机功能和性能的发展,我们需要操作的文件尺寸也是越来越大。

在.NET Framework中,我们一般使用FileStream来读取、写入文件流。

当文件只有数十kB或者数MB时,一般的文件读取方式如Read()、ReadAll()等应用起来游刃有余,基本不会感觉到太大的延迟。

但当文件越来越大,达到数百MB甚至数GB时,这种延迟将越来越明显,最终达到不能忍受的程度。

通常定义大小在2GB以上的文件为超大文件(当然,这个数值会随着科技的进步,越来越大)。

对于这样规模的文件读取,普通方法已经完全不能胜任。

这就要求我们使用更高效的方法,如内存映射法、分页读取法等。

内存映射(Memory Mapping)
内存映射的方法可以使用下面的Windows API实现。

LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
虽然使用方便,但使用上限制较多,比如规定的分配粒度(W indows下通常为64KB)等。

下面贴出内存映射法实例代码供参考,但本文不做进一步讨论。

内存映射法(使用MapViewOfFile)
分页读取法(Paging)
另外一种高效读取文件的方法就是分页法,也叫分段法(Segmentation),对应的读取单位被称作页(Page)和段(Segment)。

其基本思想是将整体数据分割至较小的粒度再进行处理,以便满足时间、空间和性能方面的要求。

分页法的概念使用相当广泛,如嵌入式系统中的分块处理(Blocks)和网络数据的分包传输(Packages)。

在开始研究分页法前,先来看看在超大文件处理中,最为重要的问题:高速随机访问。

桌面编程中,分页法通常应用于文字处理、阅读等软件,有时也应用在大型图片显示等方面。

这类软件的一个特点就是数据的局部性,无论需要处理的文件有多么大,使用者的注意力(也可以称为视口ViewPort)通常只有非常局部的一点(如几页文档和屏幕大小的图片)。

这就要求了接下来,我们要找到一种能够实现高速的随机访问,而这种访问效果还不能和文件大小有关(否则就失去了高速的意义)。

事实上,以下我们研究的分页法就是利用了「化整为零」的方法,通过只读取和显示用户感兴趣的那部分数据,达到提升操作速度的目的。

参考上图,假设计算机上有某文件F,其内容为「01234567890123456」(引号「」中的内容,不含引号,下同),文件大小为FileLength=17字节,以PageSize=3对F进行分页,总页数
可以看到,最后一页的长度为2(最后一页长度总是小于PageSize)。

当我们要读取「第n页」的数据(即页码=n)时,实际上读取的是页号PageNumber=n-1的内容。

例如n=3时,PageNumber=2,数据为「678」,该页数据偏移量范围从0x06至0x08,长度为3(PageSize)。

为便于讲述,在此约定:以下文字中,均只涉及页号,即PageNumber。

参考图2,设当PageNumber=x时,页x的数据范围为[offsetStart, offsetEnd],那么可以用如下的代码进行计算(C#2.0)。

1 offsetStart = pageNumber * pageSize;
2
3if(offsetStart + pageSize < fileSize)
4 {
5 offsetEnd = offsetStart + pageSize;
6 }
7else
8 {
9 offsetEnd = fileSize - 1;
10 }
我们常用的System.IO.FileStream类有两个重要的方法:Seek()和Read()。

1// 将该流的当前位置设置为给定值。

2public override long Seek (
3long offset,
4 SeekOrigin origin
5 )
6
7// 从流中读取字节块并将该数据写入给定缓冲区中。

8public override int Read (
9 [InAttribute] [OutAttribute] byte[] array,
10int offset,
11int count
12 )
利用这两个方法,我们可以指定每次读取的数据起始位置(offsetStart)和读取长度(offsetEnd - offsetStart),这样就可以读到任意指定的页数据。

我们可以遍历读取所有页,这就相当于普通读取整个文件(实际操作中,一般不会有需求一次读取上GB的文件)。

指定PageNumber,读取页数据
由于每次读取的数据长度(PageSize)远远小于文件长度(FileSize),所以使用分页法能够只读取程序需要的那部分数据,最大化提高程序的运行效率。

下表是笔者在实验环境下对分页法读取文件的运行效率的测试。

CPU:Intel Core i3 380M @ 2.53GHz
内存:DDR3 2048MB x2
硬盘:TOSHIBA MK3265GSX (320 GB) @ 5400 RPM
为尽量保证测试质量,测试前系统进行了重装、硬盘整理等维护操作。

该硬盘性能测试结果如下图所示。

下面是为了测试分页法而制作的超大文件读取器界面截图,图中读取的是本次试验的用例之一Windows8消费者预览版光盘镜像(大小:3.40GB)。

本次测试选择了「大、中、小」3种规格的测试文件作为测试用例,分别为:
通过进行多次读取,采集到如下表A所示的文件读取数据结果。

表中项目「分页(单页)」表示使用分页读取法,但设置页面大小为文件大小(即只有1页)进行读取。

同样的,为了解分页读取的性能变化情况,使用普通读取方法(一次读取)采集到另一份数据结果,如下表B所示。

对用例#1,该用例大小仅11MB,使用常规(单次)读取方法,仅用不到20ms即将全部内容读取完毕。

而当采用分页法,随着分页大小越来越小,文件被划分为更多的页面,尽管随机访问文件内容使得文件操作更加方便,但在读取整个文件的时候,分页却带来了更多的消耗。

例如当分页大小为1KB时,文件被分割为11,611个页面。

读取整个文件时,需要重复调用11,611次FileStream.Read()方法,增加了很多消耗,如下图所示。

(图中数据仅为全文读取操作对比)
从图中可以看到,当分页尺寸过分的小(1KB)时,这种过度追求微粒化反而导致了操作性能下降。

可以看到,即实现了微粒化,能够进行随机访问,同时仍保有一定量的操作性能,分页大小
为64KB和1MB是不错的选择。

实际上,上文介绍的MapViewOfFile函数的推荐分页大小正是64KB。

对用例#2,该用例大小为695.29MB,达到较大的尺寸,因此对读取缓存(cache)需求较高,同时也对合适的分页尺寸提出了要求。

可以看到,和用例#1不同,当文件尺寸从11.34MB增加到近700MB时,分页尺寸随之相应的扩大,是提高操作性能的好方法(下图中1MB分页)。

对用例#3,该用例达到3.4GB大小,符合我们对超大文件的定义。

通过前述2个用例的分析,可以推测,为获得最佳性能,分页大小需继续提高(比如从1MB提高到4MB)。

由于本次试验时间仓促,考虑不周,未使用「边读取、边丢弃」的测试算法,导致分页读取用例#3的数据时,数据不断在内存中积累,最终引发System.OutOfMemoryException异常,使得分页读取完整文件这项测试不能正常完成。

这一问题,需在下次的试验当中加以解决和避免。

引发System.OutOfMemoryException
尽管如此,通过试验,仍然可以清楚的看到,在常规文件(GB以下级别)操作中,分页法具有高度灵活性,但额外开销大,全文读取速度慢的问题。

当操作超大文件(GB以上级别)时,分页法的优势开始显现。

极高的数据读取灵活性带来的是和文件大小无关的随机页面访问速度(仅和分页大小有关)。

在这个级别上,文件大小往往远远超过常规方法所能读取的最大值
(0x7FFFFFFF),因此只有使用分页法,积少成多,才能完成读取完整文件的工作。

分页法使用简单,思路清晰,具有很高的灵活性和与文件长度无关的随机读取能力,最大支持文件大小理论上能够达到8,388,608 TB(Int64)。

但同时它也具有额外开销大的特点,因此不适合小文件的操作。

通过扩展该方法,我们可以几乎在所有需要大量、重复、大范围算法处理的程序中加以应用分页法的「化整为零」思想,以减少计算粒度,实现计算的可持续进行。

分页法,以及上文提到的内存映射法,其实均早已出现多年,更是广泛应用于各个行业。

笔者之所以仍旧撰写此文,一则锻炼自己的编程能力、语言归纳能力、文字写作能力,二则加深对方法的理解,通过试验得出的现象来深入方法的本质。

本文由/bczx/5247.html整理分享。

相关文档
最新文档