java FileChannel.map 内存映射map会修改文件,怎么回事

> Java 读取大文件有什么可以优化的吗? 1G-10G,该如何解决
Java 读取大文件有什么可以优化的吗? 1G-10G,该如何解决
jweibaby & &
发布时间: & &
浏览:4 & &
回复:10 & &
悬赏:0.0希赛币
Java 读取大文件有什么可以优化的吗? 1G-10G在处理1G ~ 10G 的xml文件时,发现挺慢。请问有什么可以优化的?代码上有什么注意的? 运行时有什么可以提高性能的设置码?
要看你写的代码是否高效.办法是改进算法.
jwh5566 & &
12:28:04 & &
& & (0)(0)引用
这个使用java.nio,并采用分段读取的方法是可以解决的。你自己上网查查吧MappedByteBuffer inputBuffer =
new FileInputStream(file).getChannel().map(FileChannel.MapMode.READ_ONLY, 0, fileLength);//读取大文件
haixiaoyifang & &
12:28:04 & &
& & (0)(0)引用
用个好点的SAX实现库
haixiapan & &
12:28:04 & &
& & (0)(0)引用这么大的文件肯定不能一次都读入内存~~~~~~~~JAVA中可以使用内存映射文件来操作大文件.
最大可达2GB.
下面是个简单的示例,更具体的自己看Java
DOCS或相关资料
java.io.*;
java.nio.*;
java.nio.channels.*;
LargeMappedFiles
0x8FFFFFF;
main(String[]
MappedByteBuffer
RandomAccessFile( &test.dat &,
&rw &).getChannel()
.map(FileChannel.MapMode.READ_WRITE,
out.put((byte) 'x ');
System.out.println( &Finished
writing &);
System.out.print((char)out.get(i));
haixin1010 & &
12:28:04 & &
& & (0)(0)引用读取的时候 分段读呗
haixiao112 & &
12:28:04 & &
& & (0)(0)引用
你用的SAX实现是什么?JDK默认的?apache的xerces比JDK的实现快至少30倍
haixiao5223 & &
12:28:04 & &
& & (0)(0)引用一点一点的吧?我好像在说废话。。。有一个东西叫google。。。最大可达2GB.&   Java code  import
java.io.*;
java.nio.*;
java.nio.channels.*;
LargeMappedFiles
0x8FFFFFF;
main(String[]
MappedByteBuffer
RandomAccessFile( &test.dat &,
&rw &).getChannel()
.map(FileChannel.MapMode.READ_WRITE,
out.put((byte) 'x ');
System.out.println( &Finished
writing &);
System.out.print((char)out.get(i));
haixiao112 & &
12:28:04 & &
& & (0)(0)引用
NIO 入门 - IBM 教程.chm使用nio提高io速度
haixiapan & &
12:28:04 & &
& & (0)(0)引用
读一点处理一点绝对不行.因为xml有起始标记.读一点的时候可能把一个标记分开到两次处理.自己重写readLine方法,不以\r\n为结尾,以xml的结束标记为结尾.这样每读一行以正则表达式来处理绝对比所有的XML解析器要快上百倍.
haixiapan & &
12:28:04 & &
& & (0)(0)引用分段?人家是要解析,不是拷贝,xml是严格要求起始标记的。楼主可以考虑下32楼的方法。haixiang9999 & &
12:28:04 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!尽管从JDK 1.4版本开始,Java内存映射文件(Memory Mapped Files)就已经在java.nio包中,但它对很多程序开发者来说仍然是一个相当新的概念。引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高性能Java应用应该使用内存映射文件来持久化数据。这在一些交易非常频繁的场合已经应用得很多,这些场合要求电子交易系统必须非常快速,单向时延要小于毫秒级。IO一直是那些高性能系统的一个主要关注点,内存映射文件允许你使用direct或者non-direct 字节缓存(Byte buffer)来直接读写内存。内存映射文件的一个关键优势是操作系统负责真正的读写,即使你的程序在刚刚写入内存后就挂了,操作系统仍然会将内存中的数据写入文件系统。另外一个更突出的优势是共享内存,内存映射文件可以被多个进程同时访问,起到一种低时延共享内存的作用。
什么是Java内存映射文件/IO
内存映射文件是一种允许Java程序直接从内存访问的特殊文件。通过将整个文件或者文件的一部分映射到内存中、操作系统负责获取页面请求和写入文件,应用程序就只需要处理内存数据,这样可以实现非常快速的IO操作。用于内存映射文件的内存在Java的堆空间以外。Java中的java.nio包支持内存映射文件,可以使用MappedByteBuffer来读写内存。
内存映射文件的优缺点
可能内存映射IO的主要优势是性能,内存映射文件比通过普通的IO来访问文件要快,这对于繁忙的电子交易系统来说非常重要。内存映射IO另外一个优势是能够加载普通方式无法访问的大文件,实验表明内存映射IO在大文件处理中表现得更好;但缺点是有增加页面错误(page fault)的可能,因为操作系统仅仅加载一部分文件到内存中,如果被请求的页面不在内存中那就会导致一个页面错误。大多数主流操作系统如Windows, Unix, Solaris和其他类Unix的操作系统都支持内存映射IO,在64位架构下,你几乎可以将任何文件映射到内存中并直接使用Java访问。另外一个优势是这些文件能够共享,在进程间提供共享内存,而且比普通的基于loopback接口的Socket要快10倍。
Java中MappedByteBuffer读写样例
下面的例子演示了如何使用内存映射文件来读写。我们使用RandomAccessFile打开文件并使用FileChannel的map()方法将它映射到内存,map()方法有三个输入参数:mode, position, size。返回值MappedByteBuffer是用来处理内存映射文件的字节缓存。
import java.io.RandomAccessF
import java.nio.MappedByteB
import java.nio.channels.FileC
public class MemoryMappedFileInJava {
private static int count = ; // 10 MB
public static void main(String[] args) throws Exception {
RandomAccessFile memoryMappedFile = new RandomAccessFile(&largeFile.txt&, &rw&);
// Mapping a file into memory
MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, count);
// Writing into Memory Mapped File
for (int i = 0; i & i++) {
out.put((byte) &A&);
System.out.println(&Writing to Memory Mapped File is completed&);
// reading from memory file in Java
for (int i = 0; i & 10; i++) {
System.out.print((char) out.get(i));
System.out.println(&Reading from Memory Mapped File is completed&);
memoryMappedFile.close();
下面快速总结一下Java内存映射文件和IO
1). Java语言通过java.nio包支持内存映射文件和IO。
2). 内存映射文件用于对性能要求高的系统中,如繁忙的电子交易系统
3). 使用内存映射IO你可以将文件的一部分加载到内存中
4). 如果被请求的页面不在内存中,内存映射文件会导致页面错误
5). 将一个文件区间映射到内存中的能力取决于内存的可寻址范围。在32位机器中,不能超过4GB,即2^32比特。
6). Java中的内存映射文件比流IO要快(译注:对于大文件而言是对的,小文件则未必)
7). 用于加载文件的内存在Java的堆内存之外,存在于共享内存中,允许两个不同进程访问文件。顺便说一下,这依赖于你用的是direct还是non-direct字节缓存。
8). 读写内存映射文件是操作系统来负责的,因此,即使你的Java程序在写入内存后就挂掉了,只要操作系统工作正常,数据就会写入磁盘。
9). Direct字节缓存比non-direct字节缓存性能要好
10). 不要经常调用MappedByteBuffer.force()方法,这个方法强制操作系统将内存中的内容写入硬盘,所以如果你在每次写内存映射文件后都调用force()方法,你就不能真正从内存映射文件中获益,而是跟disk IO差不多。
11). 如果电源故障或者主机瘫痪,有可能内存映射文件还没有写入磁盘,意味着可能会丢失一些关键数据。
12). MappedByteBuffer和文件映射在缓存被GC之前都是有效的。sun.misc.Cleaner可能是清除内存映射文件的唯一选择。
关于Java内存映射文件和内存映射IO就说这些了。 这相当有用,我希望你能够再深入了解一些。如果你的工作与繁忙的电子交易系统有关,那你很可能用到内存映射文件。
原文链接:http://javarevisited.blogspot.hk/2012/01/memorymapped-file-and-io-in-java.html
相关 [java 内存 映射] 推荐:
- 编程语言 - ITeye博客
尽管从JDK 1.4版本开始,Java内存映射文件(Memory Mapped Files)就已经在java.nio包中,但它对很多程序开发者来说仍然是一个相当新的概念. 引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高性能Java应用应该使用内存映射文件来持久化数据.
- ITeye博客
堆(Heap)又被称为:优先队列(Priority Queue),是计算机科学中一类特殊的数据结构的统称. 堆通常是一个可以被看做一棵树的数组对象. 在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.
- Java - 编程语言 - ITeye博客
(问题一:什么叫垃圾回收机制. ) 垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能. 当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露. (问题二:java的垃圾回收有什么特点. ) JAVA语言不允许程序员直接控制内存空间的使用.
- CSDN博客编程语言推荐文章
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的. Linux 2.6上的HotSpot使用了NPTL机制,
JVM线程跟内核轻量级进程有一一对应的关系.
- ITeye博客
JAVA的垃圾回收机制,让许多程序员觉得内存管理不是很重要,但是内存内存泄露的事情恰恰这样的疏忽而发生,特别是对于Android开发,内存管理更为重要,养成良好的习惯,有利于避免内存的泄漏..
这里可以把许多对象和引用看成是有向图,顶点可以是对象也可以是引用,引用关系就是有向边.
- ITeye博客
昨天中午,发了一篇
equals和==区别的博文,晚上再看时有几位大牛指出了其中的一些错误,很感谢他们的留言,一句简简单单的留言给了我对这些错误知识点改正的机会. 或许这就是从事互联网行业所提倡的互帮互助的精神吧,因为有分享,有交流,互联网才会发展的如此迅猛. 大牛提的一个观点很好,好的东西可以拿出来分享,错的东西却可能带给别人错误的理解,这一点我确实得向看了我写了一些bug博客的人道个歉.
- 码蜂笔记
JMM,Java Memory Model,Java 内存模型. 什么是内存模型,要他何用. 假定一个线程为变量var赋值:
var = 3;,内存模型要回答的问题是:在什么条件下,读取变量var的线程可以看到
3这个值. 如果缺少了同步,线程可能无法看到其他线程操作的结果. 导致这种情况的原因可以有:编译器生成指令的次序可以不同于源代码的“显然”版本,编译器还会把变量存储在寄存器而不是内存中;处理器可以乱序或并行执行指令;缓存会改变写入提交到主存得到变量的次序;存储在处理器本地缓存中的变量对其他处理器不可见 等等.
- ImportNew
你可以在网上找到一大堆资料让你了解JMM是什么东西,但大多在你看完后仍然会有很多疑问. happen-before是怎么工作的呢. 用volatile会导致缓存的丢弃吗. 为什么我们从一开始就需要内存模型. 通过这篇文章,读者可以学习到足以回答以上所有问题的知识. 它包含两大部分:第一部分是硬件层次的大体架构,第二部分是深入OpenJdk源代码和实现.
- Java译站
Java有垃圾回收,因此不会出现内存泄露. 尽管Java的确有垃圾回收器来回收那些不用的内存块,但你不要指望它能够点铁成金. GC减轻了开发人员肩上的负担,而原本的那些工作非常容易出错,不过并不是所有内存分配的问题它都能够解决. 更糟糕的是,Java的设计允许它可以欺骗GC,使得它能够保留一些程序已经不再使用的内存.
- Java - 编程语言 - ITeye博客
1.Java的内存机制.  Java 把内存划分成两种:一种是栈内存,另一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁.
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。}

我要回帖

更多关于 flac channel map 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信