内存映射文件

文件操作和内存映射文件

北城以北 提交于 2020-04-04 00:05:33
文件操作 上一篇已经总结了流操作,其中也包括文件的读写。文件系统除了读写以为还有很多其他的操作,如复制、移动、删除、目录浏览、属性读写等。在Java7之前,一直使用File类用于文件的操作。Java7提供了Path,Paths,Files等类,使文件操作变得简单和全面。此外还有很多第三方库也提供了文件操作的便捷类如common.io中的FileUtils类,Ant api提供的FileSet等类。 1.File类的使用 Java7之前版本中,File类即代表了路径对象也封装了文件的绝大部分操作。 File File(String pathname) File(String parent, String child) File(File parent, String child) File(URI uri) URI toURI() Path toPath() String getPath()/toString() String getName() 最后一段 String getParent() File getParentFile() String getAbsolutePath() File getAbsoluteFile() String getCanonicalPath() File getCanonicalFile() boolean isAbsolute() boolean

Windows 内存管理

允我心安 提交于 2020-03-29 03:53:38
1 . Windows 的内存结构 Windows 系统中的每个进程都被赋予它自己的虚拟地址空间。对于 32 位进程来说,这个地址空间是 4GB ,因为 32 位指针可以拥有从 0x00000000 至 0xFFFFFFFF 之间的任何一个值。对于 64 位进程来说,则这个空间是 16EB 。由于每个进程可以接收它自己的私有的地址空间,因此当进程中的一个线程正在运行时,该线程也只能访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被访问。 每个进程的虚拟地址空间都要划分成各个分区,地址空间的分区时根据操作系统的基本实现来进行的,不同的 windows 内核,其分区也略有不同。下面以 32 位 windows 2000 (x86 和 alpha 处理器 ) 分区 地址范围 作用 NULL 指针分配的区域 0x00000000 为了帮助掌握 NULL 指针的分配情况,任何读写都将引发访问违规 0x0000FFFF 用户方式分区 0x00010000 这是进程的私有空间,该分区是维护进程的大部分数据的地方。 0x7FFEFFFF 64k 禁止进入分区 0x7FFF0000 这个分区是禁止进入的,任何访问都将是违规。保留此分区是为了更加容易地实现操作系统。怕用户内存越界到内核区。 0x7FFFFFFF 内核方式 0x80000000 这个分区是存放操作系统代码的地方

Java RandomAccessFile用法

给你一囗甜甜゛ 提交于 2020-02-29 23:41:28
RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。 基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r")

MFC创建内存映射文件二

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-17 17:39:03
知道了原理,现在开始编写具体的函数 1、首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件 2、通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。 3、通过MapViewOfFile()函数通过系统管理将文件映射对象的全部或部分映射到进程的地址空间。 4、操作文件Read/Write,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样。 5、在完成了对内存映射文件的使用后,还要通过一系列的操作完成对其的清除和使用过资源的释放。 void CMFCApplication1Dlg::OnBnClickedOk()//点击OK { CreateFileMappingEx(); } void CMFCApplication1Dlg::CreateFileMappingEx()//创建映射文件 { DWORD timebegin = ::timeGetTime(); HANDLE fp = CreateFile(TEXT("E://Config.ini"),//这里输入复制的源文件 sourcc GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE

使用内存映射文件MMF实现大数据量导出时的内存优化

断了今生、忘了曾经 提交于 2020-01-14 13:00:36
前言 导出功能几乎是所有应用系统必不可少功能,今天我们来谈一谈,如何使用内存映射文件MMF进行内存优化,本文重点介绍使用方法,相关原理可以参考文末的连接 实现 我们以单次导出一个excel举例(csv同理),excel包含1~n个sheet,在每个sheet中存储的按行和列的坐标在单元格存储具体数据,如果我们要使用MMF,第一个要考虑的就是如何将整个excel合理的存储到MMF中。这里我们引入MMF两个对象: MemoryMappedFile --表示内存映射文件 MemoryMappedViewAccessor --表示随机访问的内存映射文件视图 使用MemoryMappedFile.CreateNew(string mapName, long capacity)可以得到一个指定名称和指定大小的内存映射文件,以下简称mmf * 这里需要注意的是capacity为long类型,以字节为单位,通过计算可知文件大小上限为1G 使用mmf.CreateViewAccessor(long offset, long size)可以得到一个从指定位置开始的指定大小空间的访问器,以下简称accessor * 这里同样需要注意的是size的大小,如果加上offset超过文件大小,会报System.UnauthorizedAccessException: Access to the path is

【Python学习之路】Numpy 内存映射

自古美人都是妖i 提交于 2019-12-16 00:40:31
内存映射 Numpy 有对内存映射的支持。 内存映射也是一种处理文件的方法,主要的函数有: memmap frombuffer ndarray constructor 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。 使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。 memmap memmap(filename, dtype=uint8, mode='r+' offset=0 shape=None order=0) mode 表示文件被打开的类型: r 只读 c 复制+写,但是不改变源文件 r+ 读写,使用 flush 方法会将更改的内容写入文件 w+ 写,如果存在则将数据覆盖 offset 表示从第几个位置开始。 来源: CSDN 作者: DrogoZhang 链接: https://blog.csdn.net/weixin_40400177/article/details/103550924

mmap:内存映射文件

心不动则不痛 提交于 2019-12-04 17:57:42
介绍 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。 内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每一个访问都建立一个单独的系统调用,也不需要你在缓冲区之间复制数据。实际上内核和用户应用都能直接访问内存。 内存映射文件可以看做是可修改的字符串或类似文件的对象,这取决于具体的需要。 映射文件支持一般文件的API方法,如close、flush、read、readline、seek、tell、write。他还支持字符串的API,提供切片等特性以及类似find的方法 。 读文件 import mmap ''' 使用mmap函数可以创建一个内存映射文件。第一个参数是文件描述符,可能来自file对象的fileno方法,也可能来自os.open。 调用者在调用mmap方法之前负责打开文件,不再需要文件时要负责将其关闭。 mmap函数的第二个参数是要映射的文件部分的大小(以字节为单位)。如果这个值为0,则映射整个文件,如果这个大小大于文件的当前大小,则会扩展该文件。 注意:Windows不支持长度为0的映射 ''' ''' 这两个平台都支持一个可选的参数access。使用ACCESS_READ表示只读访问;ACCESS_WRITE表示“写通过(write-through)”,即对内存的赋值直接写入文件; ACCESS

nio(2)更多功能

狂风中的少年 提交于 2019-12-02 11:17:03
目录 一 Scatter/Gatter scatter gatter 二 transferFrom & transferTo transferFrom transferTo 三 Pipe 四 内存映射文件 内存映射IO Java的内存映射IO的要点 使用 五 直接缓冲 六 总结 参考资料 一 Scatter/Gatter Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。 分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。 聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。 scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由 消息头 和 消息体 组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体 scatter //这是分散(scatter) ByteBuffer header

[译].NET 4 中玩耍内存映射文件

*爱你&永不变心* 提交于 2019-11-26 21:43:11
原文链接 : http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx 预备知识 : 本文需要你对 OS 内存管理有一定了解。 我想探索下即将到来的 .NET 4 中一些与众不同的新特性,而不是已被大众所熟知的动态类型、协变与逆变等特性。出于对性能增强的喜爱,接下来俺将发表几篇新特性的博文。 内存映射文件对于托管世界的开发人员来说,似乎就像是火星人一样陌生(画外音 : 还是回火星吧,地球上很危险嘀)。但是它确实已经行之经年,毫不客气的说,它在 OS 中的地位相当重要。实际上,任何想要共享数据的通信模型都会在幕后使用它。 那么内存映射文件究竟是个什么玩意呢?内存映射文件允许你保留一块地址空间,然后提交物理存储到这块空间(嗯,听起来是不是很像虚拟内存?)。这哥俩最主要的区别就在于物理存储来自于磁盘上已有的文件,而不是内存管理器。这样做有两大意图 : 1.访问磁盘文件上的数据不需要执行文件 I/O 操作和缓存文件内容。当你访问超大型文件数据时,作用尤其显著。 2.你能使用内存映射文件让运行在同一台机器上的多个进程共享彼此数据。 译注 : Windows 操作系统自身就使用内存映射来执行 DLL,并装载和执行 EXE 文件。