gpt4 book ai didi

c# - 使用 PLINQ 时如何避免内存不足异常?

转载 作者:太空狗 更新时间:2023-10-30 00:56:00 25 4
gpt4 key购买 nike

您好,感谢您的关注!

背景

我有一项计算任务需要大量时间或并行计算。

具体来说,我需要遍历大约 50 张图像的列表,对它们进行 Base64 编码,然后计算每个新编码的项目与包含大约 2000 个 Base64 字符串编码图像的 XML 文件中的值之间的编辑距离,以便找到XML 文件中具有最小 Lev 的字符串。与基准字符串的距离。

常规的 foreach 循环可以工作,但速度太慢,所以我选择使用 PLINQ 来利用我的 Core i7 多核处理器:

Parallel.ForEach(candidates, item => findImage(total,currentWinner,benchmark,item));

任务开始时非常出色,高速运行,但随后出现“内存不足”异常。

我正在使用 C#、.NET 4、Forms 应用程序。

问题

如何调整我的 PLINQ 代码以免用完可用内存?

更新/示例代码

下面是调用 PLINQ foreach 的方法:

private void btnGo_Click(object sender, EventArgs e)
{
XDocument doc = XDocument.Load(@"C:\Foo.xml");
var imagesNode = doc.Element("images").Elements("image"); //Each "image" node contains a Base64 encoded string.
string benchmark = tbData.Text; //A Base64 encoded string.
IEnumerable<XElement> candidates = imagesNode;

currentWinner = 1000000; //Set the "Current" low score to a million and bubble lower scores into it's place iteratively.

Parallel.ForEach(candidates, i => {
dist = Levenshtein(benchmark, i.Element("score").Value);
if (dist < currentWinner)
{
currentWinner = dist;
path = i.Element("path").Value;
}
});
}

. . .这是 Levenshtein 距离法:

public static int Levenshtein(string s, string t)    {
int n = s.Length;
int m = t.Length;
var d = new int[n + 1, m + 1];

// Step 1
if (n == 0)
{
return m;
}

if (m == 0)
{
return n;
}

// Step 2
for (int i = 0; i <= n; d[i, 0] = i++)
{
}

for (int j = 0; j <= m; d[0, j] = j++)
{
}

// Step 3
for (int i = 1; i <= n; i++)
{
//Step 4
for (int j = 1; j <= m; j++)
{
// Step 5
int cost = (t[j - 1] == s[i - 1]) ? 0 : 1;

// Step 6
d[i, j] = Math.Min(
Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
d[i - 1, j - 1] + cost);
}
}
// Step 7
return d[n, m];
}

提前致谢!

最佳答案

更新

今天在不同情况下再次遇到这个错误。我当时正在开发一个内存需求很高的桌面应用程序。确保您已将项目设置为 64 位架构以访问所有可用内存。我的项目默认设置在 x86 上,所以我不断遇到内存不足异常。当然,这仅在您可以依靠 64 位处理器进行部署时才有效。

结束更新

在为此苦苦挣扎之后,它似乎是运算符(operator)错误:

我正在从并行线程调用 UI 线程以更新进度标签,但我并没有以线程安全的方式进行。

此外,我在没有调试器的情况下运行应用程序,因此每次代码尝试从导致溢出的并行线程更新 UI 线程时都会出现未捕获的异常。

虽然我不是 PLINQ 的专家,但我猜它会为您处理所有低级分配的东西,只要您不犯这种愚蠢的臭代码错误即可。

希望这对其他人有帮助。

关于c# - 使用 PLINQ 时如何避免内存不足异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com