2

私は1つのテキストファイルをアップロードしている1つのWindowsアプリケーションを開発しています。そのテキスト ファイルには、カンマ [,] で区切られたデータが存在する 5000 行があります。バックエンドでoledb接続[MS Access]を使用しています。ファイルからカンマ区切りのデータを取得し、データベースに挿入しています。

しかし、私が観察しているように、データは約 15000 ~ 16000 レコードです。挿入には、1 秒あたり約 7 レコード近くかかっています。

この速度を上げたい。

それは、バックエンドでデータベースとして使用するものに依存しますか?

SQL Server 2005 は MS Access の代わりに速度を上げることができますか?

これを手伝ってください。

コードを参照してください:

string file = openFileDialog1.FileName;
StreamReader inputData = new StreamReader(file);
while ((line = inputData.ReadLine()) != null)
{
    subLine = line.Split(',');

    /*Taking Unique ID from tradefile table*/
    int ID=0;
    try
    {
        da=new OleDbDataAdapter("select max(ID) from tradeFile",con);
        DataSet ds=new DataSet();
        da.Fill(ds);

        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            if (ds.Tables[0].Rows[i][0].ToString() == "")
            {
            }
            else
            {
                ID = int.Parse(ds.Tables[0].Rows[i][0].ToString());
                ID++;
            }
        }
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }


    try
    {
        string unknown="unknown Fileld";
        con.Open();
       // int j=subLine.Length;
        //for(int i=0;i<subLine.Length;i++)
        {
            int i = 0;
           //int j=subLine.Length;
           //int index=subLine.Length-j;
           cmd=new OleDbCommand(
               "insert into tradeFile values('"+ID+"','"+
               subLine[i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               unknown+"')",con);
           cmd.ExecuteNonQuery();

        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        con.Close();
    }
    //counter++;
}
4

4 に答える 4

3

一度に複数の行を挿入することで速度を上げることができます。私の知る限り、sql-serverでは1つのクエリに1000行を挿入できますが、DBへのクエリは5〜6kクエリではなく5〜6クエリです。msアクセスを処理できる行数がわからない。また、挿入速度はもちろんRDBMSに依存します

upd:

テーブルの新しいIDを取得するために追加のクエリを実行することをお勧めします。あなたは本当に自動インクリメントフィールドを使うべきです、それは最初です。2番目:結果挿入クエリは次のようになります。

insert into tradeFile (field1, field2 ... fieldN) 
values (f1value1, f2value1...fNvalue1), (f1value2, f2value2...fNvalu2) etc.

そして第3に、一度にN個(SQL Serverでは1000など)を超える値を挿入できないことに注意する必要があります。そのため、コードは次のようになります。

string file = openFileDialog1.FileName;
StreamReader inputData = new StreamReader(file);
int values = 0;
const int maxValuesPerInsert = 1000;
string insertQuery = string.empty;
while ((line = inputData.ReadLine()) != null)
{
    subLine = line.Split(',');
    /*do some work to extract values (lemme call em value1, value2...)*/
    if (values < maxValuesPerInsert - 1)
    {
        insertQuery += string.format("({0}, {1}, {2}),", value1, value2, value3);
        values++;
    }
    else
    {
        insertQuery += string.format("({0}, {1}, {2})", value1, value2, value3); //just to get rid of last comma            
        var query = string.format("insert into tradeFile (field1, field2, field 3) values {0}", insertQuery);
        /*do your db query*/
        insertQuery = string.empty;
        values = 0;
    }

}
于 2013-03-01T11:14:36.300 に答える
0

はい、SQLサーバーはMSACCESSよりもはるかに高速で信頼性があります。

複数の接続で最新のアクセスを使用する場合、または集中的なワークロードがある場合は、大きなデータベースにアクセスを使用しないでください(数千のレコードがアクセスに大きくなる可能性があります)。

SQL Server Expressで十分な場合があります(無料です。ここで制限を参照してください:http ://social.msdn.microsoft.com/Forums/en-US/sqldensetup/thread/0e781eb4-1c27-4777-9bd8-bc9e1ae3e803/ )

別の「回避策」は、1つのクエリで複数の挿入を使用するか、BULK挿入を使用することです(アクセスでサポートされているかどうかはわかりません)。

于 2013-03-01T11:15:39.547 に答える
0

もちろん、MSAccessの代わりにMsSQLサーバーを使用すると速度が向上します。また、行1のクエリごとに作成していると思います。各クエリにいくつかの行を追加する必要があります。これにより、速度が向上します。

テキストファイルのデータを分割するために使用するアルゴリズムは何ですか?

于 2013-03-01T11:15:56.193 に答える
0

この速度を上げたい。

ADO.NET batchingを調べる必要があります。

SqlDataAdapter基本的に、更新、挿入、および削除コマンドを指定するDataAdapter (つまり、SQL Server を選択した場合) を作成し、DataAdapter.UpdateBatchSizeプロパティを 1 より大きい値に設定します (たとえば、1000 を試して何が起こるかを確認します)。

適度なハードウェアを使用すると、 1 秒あたり最大 10,000 行を挿入できるはずですが、いくつかの異なるバッチ サイズとプロファイルを試してみます。

SQL Server 2005 は MS Access の代わりに速度を上げることができますか?

はい、より大きなデータ セットを操作する必要がある場合は、SQL Server への切り替えを検討する必要があります。ただし、2005 年版を使用する必要はありません。SQL Server 2012 Expressは、2012 年時点で選択されている無料のエディションです。

一度に挿入する行数が非常に多い場合 (100,000 行など) は、SQLBulkCopy. SQLBulkCopy同じサーバー上の異なるテーブル間でデータをコピーするシナリオに特に適しています。

于 2013-03-01T11:20:51.520 に答える