Java 解析二进制文件并将结果存入数据库

qq_21955687 2017-08-31 10:45:54
最近在公司做一个任务:把3300+个二进制文件解析并把得到的数据导入MySQL数据库。我的流程是先获取每个二进制文件的文件名,按文件名解析后以一定格式保存到同名txt文件中。再把txt文件用load data的方式导入数据库。但是耗时要40+分钟。用了线程池处理解析文件和导入文件,以及连接池。
...全文
461 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
X元素 2017-08-31
  • 打赏
  • 举报
回复
引用 3 楼 qq_21955687 的回复:
[quote=引用 2 楼 u011619071 的回复:] 1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
公司初创,主管让我先把数据保存到数据库中。之前试过从读取file到数据库,但是每个file有几万条数据。试过批量插入,但是不好用。[/quote] 也就是file中其实是 对应关系数据库的row级的数据? 如果是这样,你尝试使用jdbc的批量操作,因为如果你是单次插入,由于事务的参与会让响应变得很慢、
qq_21955687 2017-08-31
  • 打赏
  • 举报
回复
引用 2 楼 u011619071 的回复:
1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
公司初创,主管让我先把数据保存到数据库中。之前试过从读取file到数据库,但是每个file有几万条数据。试过批量插入,但是不好用。
X元素 2017-08-31
  • 打赏
  • 举报
回复
1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
qq_21955687 2017-08-31
  • 打赏
  • 举报
回复
从哪方面入手可以有效提高效率呢?
qq_21955687 2017-08-31
  • 打赏
  • 举报
回复
引用 7 楼 u011619071 的回复:
[quote=引用 6 楼 qq_21955687 的回复:] [quote=引用 4 楼 u011619071 的回复:] [quote=引用 3 楼 qq_21955687 的回复:] [quote=引用 2 楼 u011619071 的回复:] 1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
公司初创,主管让我先把数据保存到数据库中。之前试过从读取file到数据库,但是每个file有几万条数据。试过批量插入,但是不好用。[/quote] 也就是file中其实是 对应关系数据库的row级的数据? 如果是这样,你尝试使用jdbc的批量操作,因为如果你是单次插入,由于事务的参与会让响应变得很慢、[/quote]
	public void insertSave(List<String> list) throws Exception{
		conn.setAutoCommit(false);
		String sql="insert into stockData2 values (?,?,?,?,?,?,?,?,?,?,?,?)";
		ppsm=conn.prepareStatement(sql);
		for (int i = 0; i < list.size();) {
			for (int k = 1; k <= 12; k++,i++) {
//				System.out.println(list.get(i));
				ppsm.setString(k, list.get(i));
			}
			ppsm.addBatch();
			if (i%10000==0) {
//				System.out.println(i);
				ppsm.executeBatch();
			}
		}
		ppsm.executeBatch();
		conn.commit();
	}
这段是批量插入。每行数据有12个字段。[/quote] 这样写 仍然很慢吗? 试着用静态sql的方式 处理速度回更快一些。[/quote]还是很慢
qq_21955687 2017-08-31
  • 打赏
  • 举报
回复
引用 8 楼 soton_dolphin的回复:
用 hibernate 直接把对象保存到数据库中,不需要再转txt
这样在插入的时候一样很慢
soton_dolphin 2017-08-31
  • 打赏
  • 举报
回复
用 hibernate 直接把对象保存到数据库中,不需要再转txt
X元素 2017-08-31
  • 打赏
  • 举报
回复
引用 6 楼 qq_21955687 的回复:
[quote=引用 4 楼 u011619071 的回复:] [quote=引用 3 楼 qq_21955687 的回复:] [quote=引用 2 楼 u011619071 的回复:] 1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
公司初创,主管让我先把数据保存到数据库中。之前试过从读取file到数据库,但是每个file有几万条数据。试过批量插入,但是不好用。[/quote] 也就是file中其实是 对应关系数据库的row级的数据? 如果是这样,你尝试使用jdbc的批量操作,因为如果你是单次插入,由于事务的参与会让响应变得很慢、[/quote]
	public void insertSave(List<String> list) throws Exception{
		conn.setAutoCommit(false);
		String sql="insert into stockData2 values (?,?,?,?,?,?,?,?,?,?,?,?)";
		ppsm=conn.prepareStatement(sql);
		for (int i = 0; i < list.size();) {
			for (int k = 1; k <= 12; k++,i++) {
//				System.out.println(list.get(i));
				ppsm.setString(k, list.get(i));
			}
			ppsm.addBatch();
			if (i%10000==0) {
//				System.out.println(i);
				ppsm.executeBatch();
			}
		}
		ppsm.executeBatch();
		conn.commit();
	}
这段是批量插入。每行数据有12个字段。[/quote] 这样写 仍然很慢吗? 试着用静态sql的方式 处理速度回更快一些。
qq_21955687 2017-08-31
  • 打赏
  • 举报
回复
引用 4 楼 u011619071 的回复:
[quote=引用 3 楼 qq_21955687 的回复:] [quote=引用 2 楼 u011619071 的回复:] 1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
公司初创,主管让我先把数据保存到数据库中。之前试过从读取file到数据库,但是每个file有几万条数据。试过批量插入,但是不好用。[/quote] 也就是file中其实是 对应关系数据库的row级的数据? 如果是这样,你尝试使用jdbc的批量操作,因为如果你是单次插入,由于事务的参与会让响应变得很慢、[/quote]
	public void insertSave(List<String> list) throws Exception{
		conn.setAutoCommit(false);
		String sql="insert into stockData2 values (?,?,?,?,?,?,?,?,?,?,?,?)";
		ppsm=conn.prepareStatement(sql);
		for (int i = 0; i < list.size();) {
			for (int k = 1; k <= 12; k++,i++) {
//				System.out.println(list.get(i));
				ppsm.setString(k, list.get(i));
			}
			ppsm.addBatch();
			if (i%10000==0) {
//				System.out.println(i);
				ppsm.executeBatch();
			}
		}
		ppsm.executeBatch();
		conn.commit();
	}
这段是批量插入。每行数据有12个字段。
qq_21955687 2017-08-31
  • 打赏
  • 举报
回复
引用 4 楼 u011619071 的回复:
[quote=引用 3 楼 qq_21955687 的回复:] [quote=引用 2 楼 u011619071 的回复:] 1.流程上 读取file->存储file->读取file-> 数据库 楼主是不是可以考虑,读取file-> 数据库 这样的方式? 2.为什么一定要把文件存储到数据库中? 是不是可以考虑把文件处理好格式后,放到服务器上,数据库保存文件地址。 3.因为你的是io密集型任务,理论上越多的线程越好(不用超过最大文件数即可),但实际还要看你的cpu处理能力,观察线程处理时间,对线程池进行调优。
公司初创,主管让我先把数据保存到数据库中。之前试过从读取file到数据库,但是每个file有几万条数据。试过批量插入,但是不好用。[/quote] 也就是file中其实是 对应关系数据库的row级的数据? 如果是这样,你尝试使用jdbc的批量操作,因为如果你是单次插入,由于事务的参与会让响应变得很慢、[/quote]addbatch么 运行到后面会变得很慢

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧