大于4G的文件如何全部读入内存?[请高手指点] 各位好,现在遇到一个大文件处理的问题,需要将大于4G的文件全部读入内存,然后对内存的数据进行检查校验,如果有不符合规则(校验规则比较简单)的数据,则该文件无效。 请问,这应该怎么处理好?(生产环境是64位系统,64G内存小型机) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 分段读不就行了,分N段,分段<4G 你是用JAVA??要读4G文件...你的JVM得设多大啊....现实吗...做数据校验为什么要把整个文件载入??不明白... 如果有不符合规则(校验规则比较简单)的数据如果是一行一行的校验,直接用流操作应该没什么大问题,不用全读到内存。也就是readline一行,判断一行,不符合就处理下一个文件或者做别的事情。如果不是,也可以重复用readline把要检测的内容一部分一部分的读出来然后检测,总之就是不要都读进来,无论硬件如何,崩溃的几率还是蛮大的。good luck 大文件一般不全部读入,采用nio内存映像方式读取。 因为楼主是64位系统,64G内存小型机,困此可用64位的JVM,然后JVM内存参数如:16G内存。你就一次全读入内存进行计算就行了。有一种说法是:64位JVM比32位JVM性能下降,不知是在32的OS上64JVM下降,还是指64OS上的64位的JVM性能下降,不大清楚。 import java.io.File;import java.io.RandomAccessFile;import java.nio.channels.FileChannel;import java.nio.MappedByteBuffer;import static java.nio.channels.FileChannel.MapMode.READ_WRITE;public class MemoryMappedFile{ public static void main(String[] args)throws Exception{ File file = new File("FourGFile.bin"); RandomAccessFile raf = new RandomAccessFile(file,"rwd"); FileChannel channel = raf.getChannel(); MappedByteBuffer mbb = channel.map(READ_WRITE,0,channel.size()).load(); //现在可以对mbb进行相关的读写操作 channel.close(); raf.close(); }} 无语了!!硬件再好,软件也会崩溃啊!!读取4G的文件!!!!为什么不弄个更大的呢?我来帮你问吧。要一次性读取16G的文件进内存怎么处理?各个GGMM帮帮他吧。。 在简单不过了,用 byte[] 保存文件数据即可。 太感谢你遇上这问题,顺便问一下64位JDK能在 AS400机器上稳定部署么?如果你在小型机上运行别的系统就别回复了,那就没意义了。使用java.nio ->ByteBuffer还有如下代码供你参考,顺便你测试一下在小型机上能不能行的通。你把数据改为4G试试。这个类源于apache的开源工具。 DiskFileItemFactory factory = new DiskFileItemFactory(); //超越4KB就往磁盘里面写数据,小于这个值就存入内存 factory.setSizeThreshold(4096); //设置磁盘路径 String filePath=servletContext.getRealPath("/temp/"); factory.setRepository(new File(filePath)); 双学习一个新知识点,谢谢!!!http://hi.baidu.com/kaka888/blog/item/26f59a3dacbb8701baa167fe.html 使用64位的JVM即可读取4GB+的文件到内存,上限是多少不清楚,但是应该会大于64GB 用nio的内存隐射文件吧 真没必要一次全读到内存中去 个人认为你根本就不应该考虑怎么样把4G的文件读入内存进行校验,而应该从性能和实际情况来考虑用别的方法来进行校验。比如之前有人说的分段校验,或者文件的MD5码校验。 ArrayList问题 java中url格式转换 一道java作业题本人只有一半思路 BigInteger的阶层 java冒泡法的疑问 HaspMap里的数据是怎么产生的 请教jsf中表格中表格位置固定的问题~~~ 请问怎么样输入1个1位字以上的数,和字符串,有没有现实此功能的函数? 如何在生成可执行文件的同时把jre也打包进去? digester解析XML如何转换日期 java编译的exe程序,执行的时候出现错误 请教bufferedwriter问题
要读4G文件...你的JVM得设多大啊....现实吗...做数据校验为什么要把整个文件载入??不明白...
也就是readline一行,判断一行,不符合就处理下一个文件或者做别的事情。如果不是,也可以重复用readline把要检测的内容一部分一部分的读出来
然后检测,总之就是不要都读进来,
无论硬件如何,崩溃的几率还是蛮大的。good luck
因为楼主是64位系统,64G内存小型机,困此可用64位的JVM,然后JVM内存参数如:16G内存。你就一次全
读入内存进行计算就行了。
有一种说法是:64位JVM比32位JVM性能下降,不知是在32的OS上64JVM下降,还是指64OS上的64位的JVM性能下降,不大清楚。
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.MappedByteBuffer;
import static java.nio.channels.FileChannel.MapMode.READ_WRITE;public class MemoryMappedFile{
public static void main(String[] args)throws Exception{
File file = new File("FourGFile.bin");
RandomAccessFile raf = new RandomAccessFile(file,"rwd");
FileChannel channel = raf.getChannel();
MappedByteBuffer mbb = channel.map(READ_WRITE,0,channel.size()).load();
//现在可以对mbb进行相关的读写操作 channel.close();
raf.close();
}
}
为什么不弄个更大的呢?我来帮你问吧。要一次性读取16G的文件进内存怎么处理?
各个GGMM帮帮他吧。。
使用
java.nio ->ByteBuffer还有如下代码供你参考,顺便你测试一下在小型机上能不能行的通。你把数据改为4G试试。这个类源于apache的开源工具。 DiskFileItemFactory factory = new DiskFileItemFactory();
//超越4KB就往磁盘里面写数据,小于这个值就存入内存
factory.setSizeThreshold(4096);
//设置磁盘路径
String filePath=servletContext.getRealPath("/temp/");
factory.setRepository(new File(filePath));
http://hi.baidu.com/kaka888/blog/item/26f59a3dacbb8701baa167fe.html