1

データベースから 100.000 行を読み取る必要があります。次のコードを使用します。

List<elementClass> Listelement = new List<elementClass>();
using (DbDataReader reader = cmd.ExecuteReader())
{
    while (reader .Read())
    {
        elementClass element= new elementClass();
        DatabaseClass.ReadFromObject(reader , element);
        Listelement.Add(element);
    }
}

ReadFromObject :

public static void ReadFromObject(DbDataReader dr, Object obj)
{
    DataTable tableDescriptor = dr.GetSchemaTable();

    try
    {
        //Id - Identifier
        obj.GetType().GetProperty("Id").SetValue(obj, dr.GetValue(dr.GetOrdinal("Id")), null);

        PropertyInfo[] properties = obj.GetType().GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            if (!ExistColumn(tableDescriptor, pi.Name)) continue;   // field not found
            if (dr[pi.Name] == DBNull.Value) continue;

            if (pi.PropertyType.IsEnum) { }
            else
            {
                switch (pi.PropertyType.Name)
                {
                    case "DateTime":
                        object dateValue = null;
                        if (dr[pi.Name].GetType().Name == "String")
                            dateValue = F24Common.Utility.DateFromString(dr.GetString(dr.GetOrdinal(pi.Name)));
                        else
                            dateValue = dr.GetDateTime(dr.GetOrdinal(pi.Name));
                        pi.SetValue(obj, dateValue, null);
                        break;
                    default:
                         pi.SetValue(obj, dr.GetValue(dr.GetOrdinal(pi.Name)), null);
                        break;
                }
            }
        }

    }
    catch (Exception )
    {

    }
}

このコードには明らかに問題があります。遅すぎます (処理全体に 45 ~ 50 分かかります)。複数の CPU コア (クアッドコア CPU が利用可能) を同時に使用してリストを埋めることは可能ですか?

4

1 に答える 1

1

一見、ボトルネックは反射量にあると思います。Jon Skeets の優れたMaking Reflection fly の記事を読むことをお勧めします。次に、 のタイプをキーとする適切なデリゲートをキャッシュできますobj

複数のスレッドから DataReader にアクセスするのは安全ではないので、躊躇します。

于 2012-07-02T10:57:34.547 に答える