Ric*_*odd 3 c# foreach out-of-memory generic-list sharpkml
我有一个程序,从数据库中读取大约200万行到List.每行是包含地理坐标等信息的位置.
将数据添加到List后,我使用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;
}
Run Code Online (Sandbox Code Playgroud)
这是列表中使用的类
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;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么在编写之前需要存储所有数据?不是将每一行添加到列表中,而是应该在读取时处理每一行,然后忘记它.
例如,尝试将代码一起滚动如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
这只有在Document合理实施的情况下才有效.
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |