page contents

读取2.3G大文件出现数据丢失问题

Pack 发布于 2020-02-22 19:03
阅读 906
收藏 0
分类:数据库

问题描述

读取数据文件,大小为2.3G 2490930748字节 1735516 行

最后获 2432615350左右 字节的数据 1723238行左右的 数据


大致缺少了不到1%的数据,求大佬帮忙提供一下思路,到底哪里出问题了。。


问题出现的环境背景及自己尝试过哪些方法

使用过 RandomAccessFile 尝试读取,发现读取速度感人0.0(还乱码)如果可以解决读取速度问题(使用异步)就可能出现整行文件被截断和数据混乱的现象。


相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)


protected Boolean compute() {

File file = new File(fullFileName);

BufferedReader reader = null;

List tasks = new ArrayList();


//读取的源文件大小

BigDecimal sumReadedSize = BigDecimal.ZERO;

long totalFileSize = 0;

try {


        reader = new BufferedReader( new InputStreamReader(new FileInputStream(file), "GBK"));

//用于看文件实际大小

RandomAccessFile r = new RandomAccessFile(file, “r”);

totalFileSize =r.length();


        String lineContent = "";

while (reader.ready() && (lineContent = reader.readLine()) != null) {

//if(ForkFileReadTask.getQueuedTaskCount() > 10 || ForkFileReadTask.getPool().getActiveThreadCount() > 100) {

ForkFileWriteTask fileWriteTask = this.fileSpiltter.spiltForFork(lineContent);//将任务提交pool处理,生产子文件

if(fileWriteTask != null) {

tasks.add(fileWriteTask);

fileWriteTask.fork();

BigDecimal bigDecimal = new BigDecimal(fileWriteTask.getFileSize());

sumReadedSize = sumReadedSize.add(bigDecimal);

}

}

} catch (FileNotFoundException e) {

log.error(“读取源文件错误!”);

e.printStackTrace();

} catch (IOException e) {

log.error(“读取源文件错误!”);

e.printStackTrace();

} finally {

if(reader != null) {

try {

reader.close();

} catch (IOException e) {

log.error(“关闭源文件流错误!”);

e.printStackTrace();

}

}

}


//实际写入的所有子文件大小之和

BigDecimal totalWrittenSize = BigDecimal.ZERO;

for(ForkFileWriteTask task : tasks) {

        totalWrittenSize=totalWrittenSize.add(task.join());

}


log.info("读取源文件大小为:{},实际写入文件大小为:{},总文件大小:{}",sumReadedSize.toString(),totalWrittenSize.toString(),totalFileSize);

if(sumReadedSize.equals( totalWrittenSize)) {

return true;

} else {

return false;

}

}

你期待的结果是什么?实际看到的错误信息又是什么?

结果读取的文件大小总是243200000左右与实际文件查了1%不到

读取源文件大小为:2432615350,实际写入文件大小为:2432615350,总文件大小:2490930748

做好的结果是找到问题原因,如果找不到至少找一下替代方案~~或者问题可能出在的地方

425
Pack
Pack

java去加载sqlLoad来读取,这个性能很高

请先 登录 后评论