0

データをスクラブする SSIS スクリプト コンポーネント内で VB.Net 言語を使用しています。(ビジュアルスタジオ 2010)

コードは次のとおりです。

Public Sub Main()
    Dim pk As New Package
    Dim file As New System.IO.StreamReader(Dts.Variables("User::str_SourcePath").Value.ToString())
    Dim data As String
    data = file.ReadToEnd()
    data = data.Replace("'", "")
    data = data.Replace(Chr(0), "")
    data = data.Replace(Chr(1), "")
    file.Close()
    Dim writer As New System.IO.StreamWriter(Dts.Variables("User::str_SourcePath").Value.ToString(), False)
    writer.Write(data)
    writer.Flush()
    writer.Close()

    Dts.TaskResult = ScriptResults.Success
End Sub

このスクリプト タスクは、非常に大きなファイルがある場合でもローカルで実行すると正常に実行されますが、デプロイされたパッケージは、100 MB を超える大きなファイルを操作する場合にのみサーバー上で失敗します。(SQL Server 2012)

4

3 に答える 3

0

エラー メッセージが表示されないにもかかわらず、メモリ不足エラーが発生していると思います。

解決するためのオプションは何ですか?

問題にさらにハードウェアを投入します。

パッケージを 64 ビット モードで実行していることを確認します (これにより、JET/Excel ドライバーを使用できなくなります)。それでも RAM が不足している場合は、ETL を実行する前に、ボックスにさらに RAM を追加するか、何らかの方法でメモリを解放してください。

コードを修正する

現在、コードはファイルのコンテンツ全体をメモリに読み込んで、置換を開始しています。

Aを修正

文字列は不変です。つまり、すべての文字列がメモリに格納されています。私の理解では、 のコピーは 1 つではなくdata、実行する操作のために 4 つの個別のコピーがあるということです。代わりに StringBuilder クラスを使用した場合は、記憶に優しいはずです。

修正B

データをチャンクで読み取ります。はい、それはあなたが担当するより多くのコーディングですが、問題にこれ以上ハードウェアを投入できないため、悪いことをやめなければなりません。スクラブされた行を読み書きする for each ループで十分です。

于 2013-09-25T18:17:27.990 に答える
0

解決策をブログに書きました。 http://sqldeveloper9999.wordpress.com/2013/10/03/script-component-working-locally-but-not-on-sql-server/

于 2013-10-03T23:47:20.923 に答える
0

一度に 1 行ずつ読み書きする必要があります。通常、これは高速であり、メモリをほとんど使用しません。

Public Sub Main()
    Dim pk As New Package
    Dim file As New System.IO.StreamReader(Dts.Variables("User::str_SourcePath").Value.ToString())
    'Must save it to a temp file since you cannot update the file you are reading.
    Dim sTempFile As String = "c:\temp\MyTemp.txt"
    If IO.File.Exists(sTempFile) Then IO.File.Delete(sTempFile)
    Dim writer As New System.IO.StreamWriter(sTempFile, False)
    Dim data As String
    While Not file.EndOfStream
        data = file.ReadLine
        data = data.Replace("'", "")
        data = data.Replace(Chr(0), "")
        data = data.Replace(Chr(1), "")

        writer.WriteLine(data)
    End While
    file.Close()
    writer.Flush()
    writer.Close()
    'Rename (move) your temp file to the original name
    If IO.File.Exists(Dts.Variables("User::str_SourcePath").Value.ToString()) Then IO.File.Delete(Dts.Variables("User::str_SourcePath").Value.ToString())
    IO.File.Move(sTempFile, Dts.Variables("User::str_SourcePath").Value.ToString())

    Dts.TaskResult = ScriptResults.Success
End Sub
于 2013-09-25T18:56:55.613 に答える