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

qq_21955687 2017-08-31 10:45:54
最近在公司做一个任务:把3300+个二进制文件解析并把得到的数据导入MySQL数据库。我的流程是先获取每个二进制文件的文件名,按文件名解析后以一定格式保存到同名txt文件中。再把txt文件用load data的方式导入数据库。但是耗时要40+分钟。用了线程池处理解析文件和导入文件,以及连接池。
...全文
479 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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么 运行到后面会变得很慢
图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径:返回Byte[]类型: public byte[] GetPictureData(string imagepath) { /**/////根据图片文件的路径使用文件流打开,并保存为byte[] FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重载方法 byte[] byData = new byte[fs.Length]; fs.Read(byData, 0, byData.Length); fs.Close(); return byData; }2.参数类型是Image对象,返回Byte[]类型: public byte[] PhotoImageInsert(System.Drawing.Image imgPhoto) { //将Image转换成流数据,并保存为byte[] MemoryStream mstream = new MemoryStream(); imgPhoto.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp); byte[] byData = new Byte[mstream.Length]; mstream.Position = 0; mstream.Read(byData, 0, byData.Length); mstream.Close(); return byData; }好了,这样通过上面的方法就可以把图片转换成Byte[]对象,然后就把这个对象保存到数据库中去就实现了把图片的二进制格式保存到数据库中去了。下面我就谈谈如何把数据库中的图片读取出来,实际上这是一个相反的过程。 读取图片:把相应的字段转换成Byte[]即:Byte[] bt=(Byte[])XXXX 1.参数是Byte[]类型,返回值是Image对象: public System.Drawing.Image ReturnPhoto(byte[] streamByte) { System.IO.MemoryStream ms = new System.IO.MemoryStream(streamByte); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); return img; }2.参数是Byte[] 类型,没有返回值,这是针对asp.net中把图片从输出到网页上(Response.BinaryWrite) public void WritePhoto(byte[] streamByte) { // Response.ContentType 的默认值为默认值为“text/html” Response.ContentType = "image/GIF"; //图片输出的类型有: image/GIF image/JPEG Response.BinaryWrite(streamByte); }补充: 针对Response.ContentType的值,除了针对图片的类型外,还有其他的类型: Response.ContentType = "application/msword"; Response.ContentType = "application/x-shockwave-flash"; Response.ContentType = "application/vnd.ms-excel";另外可以针对不同的格式,用不同的输出类型以适合不同的类型: switch (dataread("document_type")) { case "doc": Response.ContentType = "application/msword"; case "swf": Response.ContentType = "application/x-shockwave-flash"; case "xls": Response.ContentType = "application/vnd.ms-excel"; case "gif": Response.ContentType = "image/gif"; case "Jpg": Response.ContentType = "image/jpeg"; }

51,397

社区成员

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

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