gpt4 book ai didi

C# 通用列表 foreach OutofMemoryException

转载 作者:行者123 更新时间:2023-11-30 13:48:53 24 4
gpt4 key购买 nike

我有一个程序可以从数据库中读取大约 200 万行到列表中。每行是一个包含地理坐标等信息的位置。

将数据添加到列表后,我使用 foreach 循环并获取坐标以创建一个 kml 文件。当行数很大时,循环会遇到 OutOfMemoryException 错误(但在其他情况下可以完美运行)。

关于如何处理这个问题以便程序可以处理非常大的数据集,有什么建议吗? kml 库是 SharpKML。

我还是 C# 的新手,所以请放轻松!

这是循环:

            using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
SqlCommand cmd = new SqlCommand(select, conn);

using (cmd)
{
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
double lat = reader.GetDouble(1);
double lon = reader.GetDouble(2);
string country = reader.GetString(3);
string county = reader.GetString(4);
double TIV = reader.GetDouble(5);
double cnpshare = reader.GetDouble(6);
double locshare = reader.GetDouble(7);

//Add results to list
results.Add(new data(lat, lon, country, county, TIV, cnpshare, locshare));
}
reader.Close();
}
conn.Close();
}

int count = results.Count();
Console.WriteLine("number of rows in results = " + count.ToString());

//This code segment generates the kml point plot

Document doc = new Document();
try
{
foreach (data l in results)
{
Point point = new Point();
point.Coordinate = new Vector(l.lat, l.lon);

Placemark placemark = new Placemark();
placemark.Geometry = point;
placemark.Name = Convert.ToString(l.tiv);

doc.AddFeature(placemark);

}
}
catch(OutOfMemoryException e)
{
throw e;
}

这是列表中使用的类

        public class data
{
public double lat { get; set; }
public double lon { get; set; }
public string country { get; set; }
public string county { get; set; }
public double tiv { get; set; }
public double cnpshare { get; set; }
public double locshare { get; set; }

public data(double lat, double lon, string country, string county, double tiv, double cnpshare,
double locshare)
{
this.lat = lat;
this.lon = lon;
this.country = country;
this.county = county;
this.tiv = tiv;
this.cnpshare = cnpshare;
this.locshare = locshare;
}

}

最佳答案

为什么在写入之前需要存储所有数据?与其将每一行添加到列表中,不如在读取每一行时对其进行处理,然后将其忘掉。

例如,尝试像这样将您的代码组合在一起:

Document doc = new Document();
while (reader.Read())
{
// read from db
double lat = reader.GetDouble(1);
double lon = reader.GetDouble(2);
string country = reader.GetString(3);
string county = reader.GetString(4);
double TIV = reader.GetDouble(5);
double cnpshare = reader.GetDouble(6);
double locshare = reader.GetDouble(7);

var currentData = new data(lat, lon, country, county, TIV, cnpshare, locshare));

// write to file
Point point = new Point();
point.Coordinate = new Vector(currentData.lat, currentData.lon);

Placemark placemark = new Placemark();
placemark.Geometry = point;
placemark.Name = Convert.ToString(currentData.tiv);

doc.AddFeature(placemark);
}

这只有在 Document 被合理地实现时才有效。

关于C# 通用列表 foreach OutofMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11000880/

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