byte[]引发的血案吗

shayi1989 2012-09-26 03:51:51
我使用OpenFileDialog控件获取上传文件后将其转换为byte[]保存

但发现文件大小超过50M左右就会出现system.outofmemory的异常,byte[]的长度怎么会这么小呢,

ps:我的内存是2G,使用vs2008开发,运行起来占进程最多3,4百M,所以应该不会是系统内存方面的限制
,我是前台,调用后台的方法储存,后台根本就没执行,另小文件是可以上传成功的,50左右就报错,悲催!
...全文
505 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayun00 2012-09-27
  • 打赏
  • 举报
回复
你的程序是web的吗?

如果是web ,那么iis 应该对上传文件大小有限制

另外 限制 大小的 配置 貌似是在 machine.config 里面
jimh 2012-09-27
  • 打赏
  • 举报
回复
问题很简单,首先,buffer = new byte[stream.Length];是没错的,这个可以肯定。
workPlanService.commintWorkPlanInfo出错,那就在workPlanService里面解决
1,看看有没有什么相关配置的东西,限制的byte[]的大小,如果是WebService,还真的有限制,加大这个长度就可以了。
2,不是WebService,没什么好说的,看workPlanService对应的文档,看看有没有什么其他配置上的限制。

其实,buyte[]这种数据的传递一般都有限制的,而且一般都不会很大,50M我都觉得很过分了,如果确实有需要,改一下接口吧,共享文件/分段上传都可以,尽量不要一次过使用大的数组。
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 的回复:]
楼主,你为啥不问问写那个服务的人?这很明显是你调用的那个服务方法有错误,问题不在你。
上面很多人批判你,其实是没道理的,因为对方给的接口方法只能接收Byte[],而不能接收Stream,那么你自然没法直接传Stream了。
[/Quote]

不是啊。我们统一传的是byte[]啊,
FileStream stream = new FileInfo(aa).OpenRead();
buffer = new byte[stream.Length];
stream.Read(buffer, 0, Convert.ToInt32(stream.Length));

方法是这个workPlanService.commintWorkPlanInfo(infoForCommit, infoForOp, buffer
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 的回复:]
看看你service的每次响应是不是限制了最大值

C# code


<messaging>
<maxRequestLength>628000</maxRequestLength>
</messaging>


配置文件中类似这样的配置
[/Quote]
你说的配置可能限制了,我也考虑过,这个是config.xml的配置,已经把FileLength设很大了,别的不知道哪里还能设置
<?xml version="1.0" encoding="utf-8"?>
<config>
<property name="Version" value="V1.0.1" />
<property name="Server" value="http://10.80.1.*" />
<property name="Index" value="/kpi/rpc/userServiceRpc" />
<property name="VehFlowInterval" value="60" />
<property name="TimeOut" value="6000000" />
<property name="NavStyle" value="nav" />
<property name="FileLength" value="512000000" />
</config>

shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]
stream.Read(buffer, 0, Convert.ToInt32(stream.Length));
是是不是 这一行的时候 执行报错哦.???
[/Quote]
workPlanService.commintWorkPlanInfo(infoForCommit, infoForOp, buffer)我断点设在这一行啊,接受的参数就是buffer,但是还一句执行的影儿都没有就报错了。。
qldsrx 2012-09-27
  • 打赏
  • 举报
回复
楼主,你为啥不问问写那个服务的人?这很明显是你调用的那个服务方法有错误,问题不在你。
上面很多人批判你,其实是没道理的,因为对方给的接口方法只能接收Byte[],而不能接收Stream,那么你自然没法直接传Stream了。
  • 打赏
  • 举报
回复
看看你service的每次响应是不是限制了最大值

<messaging>
<maxRequestLength>628000</maxRequestLength>
</messaging>

配置文件中类似这样的配置
zhanglong19891129 2012-09-27
  • 打赏
  • 举报
回复
stream.Read(buffer, 0, Convert.ToInt32(stream.Length));
是是不是 这一行的时候 执行报错哦.???
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
FileStream stream = new FileInfo(aa).OpenRead();
buffer = new byte[stream.Length];
stream.Read(buffer, 0, Convert.ToInt32(stream.Length));

溢出估计就是你的buffer的长度和stream的长度不一致
[/Quote]

buffer没有溢出,就是调用后台方法的那一刻报错,我试了你的小文件也可以传,但是50M左右的还是不行
绿领巾童鞋 2012-09-27
  • 打赏
  • 举报
回复
FileStream stream = new FileInfo(aa).OpenRead();
buffer = new byte[stream.Length];
stream.Read(buffer, 0, Convert.ToInt32(stream.Length));

溢出估计就是你的buffer的长度和stream的长度不一致
绿领巾童鞋 2012-09-27
  • 打赏
  • 举报
回复
stream.Read(buffer, 0, buffer.Length);
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
你的想法已经错误了!!!
按照你的思路:
如果你上传1G的内容,首先把1G的内容都加载到内存中(即byte[])
然后将byte[]数组的内容通过workPlanService.commintWorkPlanInfo(infoForCommit, infoForOp, buffer)方法将内容上传服务器,
你的思路可行吗?
内存和网络能一次性承载1G或更大的数据流吗???……
[/Quote]

我的附件才50M啊,真心不大啊,整个软件在写入buffer后,进程也就占了300M多,我2G的内存,内存应该不存在溢出问题啊...
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
加载内存中,也就是加载在MemoryStream、内存映射文件之类的东西中。

谁跟你说过就是加载byte[]呢?请找到出处!

.net中的数组就是有大小限制的。不是无限大的,不是仅受什么1G物理内存大小限制的(何况应用程序申请到的内存大小也不可能逼近物理内存大小)。
[/Quote]

进程也就占了300M多,我2G的内存,内存应该不存在溢出问题啊...
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 的回复:]
还有一点,上传文件后一定要转换为btye[]?是要保存在数据库?
尽量避免将文件保存在数据库,如果是保存一些小图片或小文件还可以,否则应存储路径,要不然程序不爆,数据库也要爆的
[/Quote]

我传的文件名及具体文件,目前是用byte[]做参数来接收的,后台存文件名及路径,不怕数据库爆掉,现在在试着不用byte[],用你说的FileStream,研究中....
DSIOF3KIDSKTR 2012-09-27
  • 打赏
  • 举报
回复
还有一点,上传文件后一定要转换为btye[]?是要保存在数据库?
尽量避免将文件保存在数据库,如果是保存一些小图片或小文件还可以,否则应存储路径,要不然程序不爆,数据库也要爆的
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 的回复:]
引用 39 楼 的回复:

引用 38 楼 的回复:
处理文件或数据流时一定要注意:
1.尽量避免使用MemoryStream或byte[]等方式处理数据,尽量使用FileStream,并且避免多次转换,如果byte[]转MemoryStream等,一个转换内存翻倍,几次转换就不得了了,50M处理一下就可能变200M以上了,这种悲剧太多了
2.无论何种情况都应及时关闭数据流并及时释放,避……
[/Quote]
是的。。我仔细观测了一下,登录约为80M,写入buffer后展内存160,到执行方法就300M多了,翻了好几翻,然后就报错了,你说的Filestream怎么用啊,我看上搜索的也是有byte[]在转换的,你能把你的代码跟我分享下吗?
DSIOF3KIDSKTR 2012-09-27
  • 打赏
  • 举报
回复
这些代码都是很普通的代码,我已经说的很清楚了,你照这个思路去做就可以了
DSIOF3KIDSKTR 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 的回复:]

引用 38 楼 的回复:
处理文件或数据流时一定要注意:
1.尽量避免使用MemoryStream或byte[]等方式处理数据,尽量使用FileStream,并且避免多次转换,如果byte[]转MemoryStream等,一个转换内存翻倍,几次转换就不得了了,50M处理一下就可能变200M以上了,这种悲剧太多了
2.无论何种情况都应及时关闭数据流并及时释放,避免内存泄露

用的好的话……
[/Quote]
300M叫还好?那什么叫不好?如果你的软件在运行起来就是300M,然后进行文件处理,还是保持300M或310M之内的话才叫还好
shayi1989 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 的回复:]
处理文件或数据流时一定要注意:
1.尽量避免使用MemoryStream或byte[]等方式处理数据,尽量使用FileStream,并且避免多次转换,如果byte[]转MemoryStream等,一个转换内存翻倍,几次转换就不得了了,50M处理一下就可能变200M以上了,这种悲剧太多了
2.无论何种情况都应及时关闭数据流并及时释放,避免内存泄露

用的好的话,内存基本上不会增加,我用Fil……
[/Quote]

我的软件运行起来,加上写入buffer后,300M多吧,感觉还好,你能把你的代码分享我一下吗?
DSIOF3KIDSKTR 2012-09-27
  • 打赏
  • 举报
回复
处理文件或数据流时一定要注意:
1.尽量避免使用MemoryStream或byte[]等方式处理数据,尽量使用FileStream,并且避免多次转换,如果byte[]转MemoryStream等,一个转换内存翻倍,几次转换就不得了了,50M处理一下就可能变200M以上了,这种悲剧太多了
2.无论何种情况都应及时关闭数据流并及时释放,避免内存泄露

用的好的话,内存基本上不会增加,我用FileStream处理上传、下载,别说50M的文件,2G的文件基本上也不会增加内存,根本不存在内存溢出和泄露的问题
加载更多回复(22)

109,897

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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