for(int i=0;i<=100000;i++)
{
EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}
比如这样?
27 个解决方案
#1
和new是否多没有关系。
只要这个对象没有被任何引用变量引用,就会被回收。
只要这个对象没有被任何引用变量引用,就会被回收。
#2
不用你操心,。net有垃圾回收,我还曾经试过,开始内存会增长,增长到一定程度就不动了。
#3
EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;
这样呢?
#4
运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降
#5
楼主你的头像可否换下
#6
只是说这么做有没有必要。
#7
必然比不new费内存 。
但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。
但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。
#8
- -!
#9
呃...我要是循环几万,几百万次呢?
#10
啊,程序报了内存不足的问题!但是该释放的我都释放了,实在找不到哪还有内存的问题!
头疼!
头疼!
#11
几十万次也没啥,回收机制不是很了解,但肯定不会让内存中留着这几十万个数据,都被清理了。
但具体清理时机不清楚,
内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。
但具体清理时机不清楚,
内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。
#12
若new出的对象都在使用,那可能使内存不足
#13
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
找到了我把try catch 去掉以后 报的内存错误是在这地方
但是这个对象我用完以后就释放掉了啊?
这是怎么回事
#14
运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降
整体代码是什么?
整体代码是什么?
#15
你写一个静态类,专处理EXIFMetaData类里的
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题
#16
public Metadata GetEXIFMetaData(string PhotoName)
{
// 创建一个图片的实例
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
// 创建一个整型数组来存储图像中属性数组的ID
int[] MyPropertyIdList = MyImage.PropertyIdList;
//创建一个封闭图像属性数组的实例
PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length];
//创建一个图像EXIT信息的实例结构对象,并且赋初值
#region 创建一个图像EXIT信息的实例结构对象,并且赋初值
Metadata MyMetadata = new Metadata();
MyMetadata.DatePictureTaken.Hex = "9003";
// MyMetadata.Ver.Hex = "9000"; //
MyMetadata.MakeSoftware.Hex = "131";
#endregion
// ASCII编码
System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding();
int index = 0;
int MyPropertyIdListCount = MyPropertyIdList.Length;
if (MyPropertyIdListCount != 0)
{
foreach (int MyPropertyId in MyPropertyIdList)
{
MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId);
#region 初始化各属性值
string myPropertyIdString = MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x");
switch (myPropertyIdString)
{
//case "9000":
// {
// MyMetadata.Ver.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
// MyMetadata.Ver.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
// break;
// }
case "9003":
{
MyMetadata.DatePictureTaken.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
MyMetadata.DatePictureTaken.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
break;
}
case "131":
{
if (MyImage.GetPropertyItem(MyPropertyId).Value != null)
{
MyMetadata.MakeSoftware.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
MyMetadata.MakeSoftware.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
break;
}
else
{
break;
}
}
//省略N行相似代码
}
#endregion
index++;
}
MyImage.Dispose();
}
return MyMetadata;
}
整个方法
#17
有木有人。
#18
EXIFMetaData em = null;
for(int i=0;i<=100000;i++)
{
em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}
#19
学习下
#20
用完了,调用释放即可。
#21
lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。
我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。
我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。
#22
工具解决方法 --> 公布解决方法
#23
1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
LZ试试GC.Collect();可以吧,释放后进行强制回收。
2、建议LZ换个头像,真的让人作呕。
LZ试试GC.Collect();可以吧,释放后进行强制回收。
2、建议LZ换个头像,真的让人作呕。
#24
学习了,问题找到了
坑爹的高清图片!他妈的那张图片居然21兆 - -!所以生成图片对象就内存不足了!
#25
那个试过 没用。不过还是谢谢大家啦!哈哈。
#26
呃,你从哪儿看出来我滥用 try...catch咧?
我上面的代码都没用这个
#27
顶,倒胃口啊
#1
和new是否多没有关系。
只要这个对象没有被任何引用变量引用,就会被回收。
只要这个对象没有被任何引用变量引用,就会被回收。
#2
不用你操心,。net有垃圾回收,我还曾经试过,开始内存会增长,增长到一定程度就不动了。
#3
EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;
这样呢?
#4
运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降
#5
楼主你的头像可否换下
#6
只是说这么做有没有必要。
#7
必然比不new费内存 。
但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。
但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。
#8
- -!
#9
呃...我要是循环几万,几百万次呢?
#10
啊,程序报了内存不足的问题!但是该释放的我都释放了,实在找不到哪还有内存的问题!
头疼!
头疼!
#11
几十万次也没啥,回收机制不是很了解,但肯定不会让内存中留着这几十万个数据,都被清理了。
但具体清理时机不清楚,
内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。
但具体清理时机不清楚,
内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。
#12
若new出的对象都在使用,那可能使内存不足
#13
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
找到了我把try catch 去掉以后 报的内存错误是在这地方
但是这个对象我用完以后就释放掉了啊?
这是怎么回事
#14
运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降
整体代码是什么?
整体代码是什么?
#15
你写一个静态类,专处理EXIFMetaData类里的
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题
#16
public Metadata GetEXIFMetaData(string PhotoName)
{
// 创建一个图片的实例
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
// 创建一个整型数组来存储图像中属性数组的ID
int[] MyPropertyIdList = MyImage.PropertyIdList;
//创建一个封闭图像属性数组的实例
PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length];
//创建一个图像EXIT信息的实例结构对象,并且赋初值
#region 创建一个图像EXIT信息的实例结构对象,并且赋初值
Metadata MyMetadata = new Metadata();
MyMetadata.DatePictureTaken.Hex = "9003";
// MyMetadata.Ver.Hex = "9000"; //
MyMetadata.MakeSoftware.Hex = "131";
#endregion
// ASCII编码
System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding();
int index = 0;
int MyPropertyIdListCount = MyPropertyIdList.Length;
if (MyPropertyIdListCount != 0)
{
foreach (int MyPropertyId in MyPropertyIdList)
{
MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId);
#region 初始化各属性值
string myPropertyIdString = MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x");
switch (myPropertyIdString)
{
//case "9000":
// {
// MyMetadata.Ver.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
// MyMetadata.Ver.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
// break;
// }
case "9003":
{
MyMetadata.DatePictureTaken.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
MyMetadata.DatePictureTaken.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
break;
}
case "131":
{
if (MyImage.GetPropertyItem(MyPropertyId).Value != null)
{
MyMetadata.MakeSoftware.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
MyMetadata.MakeSoftware.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
break;
}
else
{
break;
}
}
//省略N行相似代码
}
#endregion
index++;
}
MyImage.Dispose();
}
return MyMetadata;
}
整个方法
#17
有木有人。
#18
EXIFMetaData em = null;
for(int i=0;i<=100000;i++)
{
em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}
#19
学习下
#20
用完了,调用释放即可。
#21
lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。
我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。
我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。
#22
工具解决方法 --> 公布解决方法
#23
1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
LZ试试GC.Collect();可以吧,释放后进行强制回收。
2、建议LZ换个头像,真的让人作呕。
LZ试试GC.Collect();可以吧,释放后进行强制回收。
2、建议LZ换个头像,真的让人作呕。
#24
学习了,问题找到了
坑爹的高清图片!他妈的那张图片居然21兆 - -!所以生成图片对象就内存不足了!
#25
那个试过 没用。不过还是谢谢大家啦!哈哈。
#26
呃,你从哪儿看出来我滥用 try...catch咧?
我上面的代码都没用这个
#27
顶,倒胃口啊