内存映射文件方式(MappedByteBuffer)处理文件的实例

package org.phoenix.cases.kafka;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import org.junit.Test;
/**
 * 内存映射文件方式处理文件的实例
 * @author mengfeiyang
 *
 */
public class MappedBytes {
 String filePath = "E:\\工作目录\\新项目\\凤舞一期\\backup\\new_show_style_json.txt";
 
 
 /**
  * 内存映射文件方式处理文件的实例
  * @throws FileNotFoundException
  * @throws IOException
  */
 @SuppressWarnings("resource")
 @Test
 public void testMappedByte() throws FileNotFoundException, IOException {
  long start = System.currentTimeMillis();
  File file = new File(filePath);
  long fileLength = file.length();
  final int BUFFER_SIZE=0x500000;//5M
  MappedByteBuffer inputBuffer = new RandomAccessFile(file,"rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, fileLength);
  byte[] dst = new byte[BUFFER_SIZE];
  int count=0;
  for(int offset=0;offset<fileLength;offset += BUFFER_SIZE){
            if (fileLength - offset >= BUFFER_SIZE) {    
                for (int i = 0; i < BUFFER_SIZE; i++)    
                    dst[i] = inputBuffer.get(offset + i);    
            } else {    
                for (int i = 0; i < fileLength - offset; i++)    
                    dst[i] = inputBuffer.get(offset + i);    
            }    
            String bs = new String(dst,"UTF-8");//将buffer中的字节转成字符串
            String[] ns = bs.split("\n");
            for(String s : ns){
             if(s.contains("-1-")){
              count++;
              System.out.println(s.split("-1-")[0]);
             }
            }
           
            System.out.println();
            //String s = IOUtils.toString(new ByteArrayInputStream(dst));
            //System.out.println(s);
  }
  System.out.println("总处理条数:"+count);
  long end = System.currentTimeMillis();
 
  System.out.println((end - start)/1000);//处理809M的文件,90000条数据,只用了6秒
 }
 
 }
}
时间: 2024-11-03 13:11:03

内存映射文件方式(MappedByteBuffer)处理文件的实例的相关文章

内存映射文件处理大文件

先说结论:使用内存映射文件来处理大文件可以提高效率. 为什么呢? 我们先来看看如果不使用内存映射文件的处理流程是怎样的,首先我们得先读出磁盘文件的内容到内存中,然后修改,最后回写到磁盘上.第一步读磁盘文件是要经过一次系统调用的,它首先将文件内容从磁盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间,实际上是两次数据拷贝.第三步回写也一样也要经过两次数据拷贝. 所以我们基本上会有四次数据的拷贝了,因为大文件数据量很大,几十GB甚至更大,所以拷贝的开销是非常大的. 而内存映射文件是操作系统

4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

 新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CONFIG += C++11 MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H   #include <QWidget>   class MyWidget : public QWidget {     Q_OBJECT public:     expli

Java NIO内存映射---上G大文件处理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

Java NIO内存映射---上G大文件处理(转)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

67.文件映射为内存进行操作与多线程 以及 文件映射到内存根据索引进行内存来实现读取多线程操作

问题引出: //有限的额内存情况怎么干活//索引载入内存,多线程//索引映射为内存 一.载入内存,按行读取进行多线程 定义路径以及其他信息 1 char path[256] = "kaifangX.txt"; 2 char indexpath[256] = "indexkf.txt"; 3 #define N 20151574 创建索引 1 struct index 2 { 3 int *pindex;//地址 4 int length; 5 }allindex =

共享内存之——mmap内存映射

共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过systemV共享内存机制实现.应用接口和原理很简单,内部机制复杂.为了实现更安全通信,往往还与信号灯等同步机制共同使用. 这一篇详解mmap内存文件映射原理及其案例,system V共享内存 以及他们的区别将在后面的随笔中讨论. 非原创,内容源于互联网 mmap内存文件映射 一.传统文件访问 unix

linux mmap 内存映射【转】

转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc mmap共享内存进程通信 总结 http://www.perfgeeks.com/?p=723 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间),如此

Linux之共享内存shm和内存映射mmap

一.共享内存shm 1 概念:多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信,而且不需要数据的拷贝,所以速度最快. 二.内存映射mmap 1 前言:先介绍一下普通的读写文件的原理,进程调用read/write系统调用后会陷入内核,内核开始读写文件,假设内核是在读文件,内核先把文件读取到内核缓冲区,然后把内核缓冲区的数据拷贝到用户缓冲区,实际上整个过程拷贝了两次数据,即先从文件到内核缓冲区,再从内核缓冲区到用户缓冲区: 2 概念:把某个文件映射到进程的地

inux内存映射和共享内存理解和区别

可以看到内存映射中需要的一个参数是int fd(文件的标识符),可见函数是通过fd将文件内容映射到一个内存空间, 我需要创建另一个映射来得到文件内容并统计或修改,这时我创建这另一个映射用的仍是mmap函数, 它仍需要用到fd这个文件标识,那我不等于又重新打开文件读取文件里的数据 1.既然这样那同对文件的直接操作有什么区别呢? 2.映射到内存后通过映射的指针addr来修改内容的话是修改共享内存里的内容还是文件的内容呢? 3.解决上面2个问题,我还是想确切知道共享内存有什么用??? 一种回答|: 1