- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Linq to Sql。这是代码:
Dictionary<string, int> allResults;
using (var dc= new MyDataContext())
{
dc.CommandTimeout = 0;
allResults = dc.MyTable.ToDictionary(x => x.Text, x => x.Id);
}
它在 64 位机器上运行,编译是 AnyCPU。它抛出 System.OutOfMemoryException。
这会访问 SQL Server 数据库。 Id 字段映射到 SQL Server int 字段,Text 字段映射到 Text(nvarchar(max)) 字段。运行 select COUNT(*) from TableName
得到 1,173,623 条记录,运行 select sum(len(Text)) from TableName
得到 48,915,031 条记录。由于 int 是一个 32 位整数,id 应该只占用 4.69MB 的空间,字符串应该不到 1GB。所以我们甚至没有违反 2GB/对象的限制。
然后我以这种方式更改代码:
Dictionary<string, int> allResults;
using (var dc = new MyDataContext())
{
Dictionary<string, int> threeHundred;
dc.CommandTimeout = 0;
var tot = dc.MyTable.Count();
allResults = new Dictionary<string, int>(tot);
int skip = 0;
int takeThis = 300000;
while (skip < tot)
{
threeHundred = dc.MyTable.Skip(skip).Take(takeThis).ToDictionary(x => x.Text, x => x.Id);
skip = skip + takeThis;
allResults = allResults.Concat(threeHundred).ToDictionary(x => x.Key, x => x.Value);
threeHundred = null;
GC.Collect();
}
}
我了解到这里的垃圾收集没有帮助,一旦 skip = 900,000,就会在 while 循环的第一行抛出内存不足异常。
出了什么问题,我该如何解决?
最佳答案
在不考虑应该占用多少内存的情况下(因为可能存在编码问题,很容易使数据大小加倍),我将尝试提供一些建议。
从问题的原因开始 - 我的猜测是 threeHundred 字典导致了大量分配。当您像上面那样将项目添加到字典时,字典将无法知道它应该预先分配多少项目。这将导致大量重新分配和处理所有数据到新创建的字典。在向 threeHundred 字典添加任何项目之前,请设置一个大小(使用 ctor)。
请阅读我发表的这篇深入探讨词典内部结构的文章 - 我相信它会阐明这些症状。 http://www.codeproject.com/Articles/500644/Understanding-Generic-Dictionary-in-depth
此外,当尝试填充如此大量的数据时,我建议完全控制过程。我的建议:
无论哪种方式,您都应该检查您是在 32 位还是 64 位上运行。 .Net 4.5 更喜欢 32 位。 (在任务管理器或项目属性中查看)
希望对您有所帮助,Ofir.
关于c# - 为什么我会收到 System.OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23348569/
我已经花了几周的时间来解决这个问题。但我仍然无法解决这个问题。 我在 angularjs 中使用 http 调用 Web API 服务 $http({
我的转储文件包含 OutOfMemoryException 但所有对象字段似乎都为空。这只是一个误报还是有办法知道这个异常(exception)? 0:052> !do 000000027fff10e
我使用的项目包含许多从单个基类继承的类。在单元测试中,我需要按类型和数据比较收到的结果。 当我在条件列表包含足够多的不同条件的情况下使用类型匹配比较时,编译器会抛出 OutOfMemoryExcept
我的应用程序在 512mb 手机模拟器上运行时突然崩溃(可重现)(只有 920 来测试)。没有任何异常,它只是变黑了。然后我在应用程序上运行分析工具,发现内存在应用程序崩溃时达到了极限。应用程序退出并
我试图弄清楚应该如何使用 MemoryCache 以避免出现内存不足异常。我来自 ASP.Net 背景,缓存管理它自己的内存使用,所以我希望 MemoryCache 会做同样的事情。正如我制作的波纹管
我从某个生产代码版本中获得了异常日志。 System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was
比如说,我们有一个表,其中包含一些包含 jpg 文件二进制数据的大型 text 字段。任务是从磁盘上的数据库中获取这些文件。因此,起初我决定执行以下操作: MyDataContext dc = new
在 Windows 窗体 C# 应用程序中,我有一个文本框,用户可以在其中粘贴日志数据,并对其进行排序。我需要单独检查每一行,所以我按新行拆分输入,但如果有很多行,超过 100,000 行左右,它会抛
我们正在将一个大的平面文件加载到 BizTalk Server 2006(原始版本,不是 R2)中 - 大约 125 MB。我们针对它运行一个映射,然后获取每一行并调用一个存储过程。 我们在编排处理期
比如说,我们有一个表,其中包含一些包含 jpg 文件二进制数据的大型 text 字段。任务是从磁盘上的数据库中获取这些文件。因此,起初我决定执行以下操作: MyDataContext dc = new
在我的应用程序中,用户可以启动相机 Intent 并拍照并将其保存到自定义文件夹中。然后他们可以重新启动相机拍摄另一张照片等。因此最终用户可以拍摄多张照片。 我遇到的问题是,在我的画廊中,当我尝试将所
在 Windows 窗体 C# 应用程序中,我有一个文本框,用户可以在其中粘贴日志数据,并对其进行排序。我需要单独检查每一行,所以我按新行拆分输入,但如果有很多行,超过 100,000 行左右,它会抛
我收到 OutOfMemoryException,而堆似乎仍然有足够的剩余空间。 我自己的日志报告 - VM 内存使用了 48G 中的 22.28G 来自-XX:+PrintGCDetails -XX
给定一个简单的案例类 case class Rating(user: Int, item: Int, rating: Double) 和两个RDD[Rating]:我们得到的 OOME 在两个 R
我正在开发一个应用程序,该应用程序使用移动设备拍照并使用网络服务发送照片。但是在我拍了 4 张照片之后,我在下面的代码中得到了一个 OutOfMemoryException。我尝试调用 GC.Coll
我想调整我网站中图片的大小,但是当我使用 Bitmap 加载 14032*19864(png 扩展名)的图片时,抛出 OutOfMemoryException。我的编译器配置是 any cpu。我在怀
在我的应用程序中,我正在使用 Windows 服务读取文件。该服务每秒读取一次文件。这是我用来读取文件的代码: public static byte[] GetBytesFromFile(string
我正在尝试将用户的整个桌面捕获为图像。我通过以下方式执行此操作: public Bitmap CaptureScreen() { // Set up a bit
我正在开发一个 64 位 .Net Windows 服务应用程序,该应用程序本质上加载了一堆数据以供处理。在执行数据量测试时,我们能够压倒该进程并抛出 OutOfMemoryException(我没有
我知道我的问题没有简单的答案,但我会很感激想法、指南或某种要看的东西列表 我有一个不断抛出 OutOfMemoryException 异常的网络 Windows 服务。该服务有两个针对 x86 和 x
我是一名优秀的程序员,十分优秀!