page contents

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

Pack 发布于 2020-02-22 19:40
阅读 813
收藏 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
做好的结果是找到问题原因,如果找不到至少找一下替代方案~~或者问题可能出在的地方

429
Pack
Pack

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

请先 登录 后评论