asp.net 超大文本文件入库如何解决,100分求助

jms918 2020-09-23 10:25:58
文件文件有1G左右,每行的字符个数不一致。每行数据有300列,每列之间使用逗号分隔。
想通过每读取一行,对这行数据分解写入oracle数据库,当运行后出现HTTP Error 413.1 - Request Entity Too Large。
如果通过文件流来读取,每次读取的数据不一定是完整的每行数据。
请赐教
...全文
7378 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jms918 2020-10-12
  • 打赏
  • 举报
回复
已经解决,谢谢各位的解答
wanghui0380 2020-09-28
  • 打赏
  • 举报
回复
我们想的事情是为啥他是oracle,而不是OSS
三楼の郎 2020-09-27
  • 打赏
  • 举报
回复
引用 楼主 jms918 的回复:
文件文件有1G左右,每行的字符个数不一致。每行数据有300列,每列之间使用逗号分隔。 想通过每读取一行,对这行数据分解写入oracle数据库,当运行后出现HTTP Error 413.1 - Request Entity Too Large。 如果通过文件流来读取,每次读取的数据不一定是完整的每行数据。 请赐教
每列之间以逗号分隔的这种固定格式的文本文件是可以当作数据库来处理的,可以用dataset或datatable打开后一行一行的读取,具体问度娘“ado.net 文本文件”。 1G太大通常做法都是直接拷贝到机房用导入导出工具或命令操作,当然如果可以远程访问数据库的话也可以不用上机房,具体可以问度娘"txt文件导入oracle数据库"。
Rimifon 2020-09-26
  • 打赏
  • 举报
回复
明白意思了,应该是导数据入库。有个什么对象有ReadLine功能,可以逐行读文本,逐行处理就好了。
Rimifon 2020-09-26
  • 打赏
  • 举报
回复
上传1G的文件,你服务器的空间得大,有可能不到一个月磁盘使用就达到Tb级别了。一定要这么做的话,参考云平台的对象存储,磁盘不够,直接上新服务器继续存储。
  • 打赏
  • 举报
回复
这类问题的提出,其实可能首先就是针对你们的技术的一次挑战,要求淘汰一批系统开发商。
  • 打赏
  • 举报
回复
引用 7 楼 jms918 的回复:
现在是可以读取,读到几万行后,超时了。不知道怎么解决


技术解决方案的不同,其实受限于认知。当你通过网页上传一个1G大小的文本文件的时候,就应该从 js 端对文件内容进行逻辑拆分(使用 html5 的能力),或者考虑 http 是否应该淘汰掉,换 websocket?!
lijing3333 2020-09-25
  • 打赏
  • 举报
回复
压缩包上传 然后压缩包解压 txt 建立一个临时数据库表 记录解压txt 的读取状态 比如读取到x行x个字符 另外写一个windows服务程序 进行循环读取 比如数据库写入3万行 就让服务程序断开 从新读取写入数据 当txt全部读去完 修改txt表的状态值。 http上传之后就可以不用管读txt是否读取完毕了 让服务程序去写入数据库 http上传之后txt的状态就是文件写入中 需要一定的时间。
jms918 2020-09-24
  • 打赏
  • 举报
回复
现在是可以读取,读到几万行后,超时了。不知道怎么解决
jms918 2020-09-24
  • 打赏
  • 举报
回复
string filePath = @"c:\\aa.txt"; int bufferSize = 102400; //每次读取的字节数 byte[] buffer = new byte[bufferSize]; System.IO.FileStream stream = null; try { stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open); long fileLength = stream.Length;//文件流的长度 int readCount = (int)Math.Ceiling((double)(bufferSize / fileLength)); //需要对文件读取的次数 int tempCount = 0;//当前已经读取的次数 do { stream.Read(buffer, tempCount * bufferSize, bufferSize); //分readCount次读取这个文件流,每次从上次读取的结束位置开始读取bufferSize个字节 //这里加入接收和处理数据的逻辑 //Console.WriteLine(Encoding.UTF8.GetString(buffer)); string s=Encoding.Default.GetString(buffer); } while (tempCount < readCount); } catch { } finally { if (stream != null) stream.Dispose(); }
大鱼> 2020-09-24
  • 打赏
  • 举报
回复
按行读取思路是对的啊,只是你服务器限制了你的每次上传的大小,可以采用压缩的方式进行上传也行
tcmakebest 2020-09-24
  • 打赏
  • 举报
回复
问题在这里:: 每次读取的数据不一定是完整的每行数据
jms918 2020-09-23
  • 打赏
  • 举报
回复
为什么看不到别人的回复啊
X-i-n 2020-09-23
  • 打赏
  • 举报
回复
不过回过头来看,你这个需求用当前方案来实现不是太合理,内网的话好说,如果是走的公网,需要上传1G的文件,应该考虑用其它方式,走HTTP问题太多了: 体积限制调高,被攻击的时候服务器秒躺; 文件体积过大,即使正常的请求也会给服务器带来较大压力; 文件体积过大,服务器后端接收到文件以后,处理会比较吃力; 传输时间过长,很可能超时; 传输时间过长,严重影响业务效率; 如果传输中断,无法重传。
X-i-n 2020-09-23
  • 打赏
  • 举报
回复
两个方向:1. 把请求体积限制调高点,但太吃服务器资源;2. 减小文件体积,比如上传的时候使用zip格式。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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