C#list集合问题
我本地运行一个程序用了list集合
里面数据量有140,000
本地跑完需要6个小时,本机内存6G
我上传到服务器,内存16G,跑完需要20几个小时,怎么回事 --------------------编程问答-------------------- 那还得看你服务器的可用内存吧.一次性搞这么多? --------------------编程问答-------------------- 神仙才知道,谁知道你做什么运算了,服务器什么配置,或许你的算法太差 --------------------编程问答-------------------- 什么List什么运算啊。
俺觉得list<大英百科全书>.sort()也不至于那么长时间 --------------------编程问答-------------------- 一个LIST 和 内存扯上关系了 --------------------编程问答--------------------
我只是循环这个list ,次数有点多,14万 --------------------编程问答--------------------
那为什么相差这么多呢,能分析下原因吗 --------------------编程问答--------------------
算法,我仅仅是循环这个list,做插入操作 --------------------编程问答-------------------- 14万次循环插入?如果是链表结构的话也不算啥呀。
每次插入的数据有1个G? --------------------编程问答--------------------
每次插入的,很少,仅十二个字段而已,信息量小 --------------------编程问答-------------------- 插入数据库?你插入时每次都重新打开数据库连接?没有连接池?and so on --------------------编程问答-------------------- 你插入是数据库插入?? 循环一次插入一次? --------------------编程问答-------------------- List<T> 中的结构是一样的,是否可以考虑批量插入呢,比如每次1000条 --------------------编程问答-------------------- 该怎么改呢 --------------------编程问答-------------------- 是的 --------------------编程问答--------------------
public int ExecuteNonQuery(string connectionString, string spName, string[] paramsNames, params object[] parameters)
{
if (paramsNames.Length != parameters.Length)
throw new Exception("存储过程参数匹配错误!");
SqlParameter[] paras = new SqlParameter[parameters.Length];
for (int i = 0; i < parameters.Length; i++)
{
paras[i] = new SqlParameter(paramsNames[i], parameters[i]);
}
return _sqlDataHelper.ExecuteNonQuerySP(connectionString, spName, paras);
} --------------------编程问答-------------------- 楼主要吗给出源码,要吗把问题说清楚。
这种不清不楚的问题,猜起来费劲 --------------------编程问答--------------------
你那些写会导致每次都打开关闭数据库连接。估计_sqlDataHelper工具类 _sqlDataHelper.ExecuteNonQuerySP(connectionString, spName, paras);就是每次打开新连接的。虽然据说ADO.NET自带线程池(据说,没看到过官方证实)。但是你可以尝试下如下写:
最好是
using(SqlConnection conn=new SqlConnection(connectionString)){
//打开数据连接等你需要的操作
.........
conn.open();
.........
for(遍历你的list){
SqlCommand cmd = new SqlCommand("XXXX", conn);
cmd.CommandType = CommandType.StoredProcedure;
......//ADO.NET运行存储过程的代码,你可以网上找下模仿着来
cmd.ExecuteNonQuery();
}
}
此外 在上面基础上你可以多开几个线程,比如把数据分成5个部分,用5个线程执行去分别执行其中一部分。不过基本上单线程就可以了。
我这么写,打开事务的情况下,插入3627行数据,提交事务完成,这个过程在1分钟之内。因为中间涉及网络通信,所以具体时间我也没测过。
--------------------编程问答--------------------
[color=#FFFF99] foreach (SearchResult sr in results)
{
i++;
User user =ReadUser(sr);
SqlParameter[] parameters = {
new SqlParameter("@login_username", SqlDbType.VarChar),
new SqlParameter("@name", SqlDbType.VarChar),
new SqlParameter("@email", SqlDbType.VarChar),
new SqlParameter("@gender", SqlDbType.Int),
new SqlParameter("@province", SqlDbType.VarChar),
new SqlParameter("@city", SqlDbType.VarChar),
new SqlParameter("@address", SqlDbType.VarChar),
new SqlParameter("@birthday", SqlDbType.DateTime),
new SqlParameter("@mobilephone", SqlDbType.VarChar),
new SqlParameter("@group", SqlDbType.VarChar),
new SqlParameter("@company", SqlDbType.VarChar),
new SqlParameter("@department", SqlDbType.VarChar),
new SqlParameter("@office", SqlDbType.VarChar),
new SqlParameter("@team", SqlDbType.VarChar),
new SqlParameter("@state", SqlDbType.Int)
};
user.GroupCompany = "浙江移动总公司";
parameters[0].Value = user.ID;
parameters[1].Value = user.Name;
parameters[2].Value = user.EmailAddress;
parameters[3].Value = user.Gender;
parameters[4].Value = user.Province;
parameters[5].Value = user.City;
parameters[6].Value = user.Street;
parameters[7].Value = user.Birthday ;
parameters[8].Value = user.MobilePhone;
parameters[9].Value = "浙江移动总公司";
parameters[10].Value = user.Company;
parameters[11].Value = user.DepartmentName;
parameters[12].Value = user.OfficeLocation;
parameters[13].Value = user.Team;
parameters[14].Value = user.Status_Attribute;
try
{
SqlDataReader a= DbHelperSQL.RunProcedure("ImportSyncProfileofBosss", parameters);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}}[/color]
补充:.NET技术 , C#