Frage

Ich versuche, eine kleine Test-Anwendung zu erstellen, die Stücke von einem Filestream liest und hängt es an einen VarBinary (max) Spalte auf einem SQL Server 2005 Express.

Alles funktioniert - die Säule gefüllt wird, wie es soll, aber meine Maschine scheint noch alles in den Speicher zu puffern und ich kann einfach nicht verstehen, warum

.

Ich verwende den folgenden Code (C #):

using (IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString))
{
    connection.Open();

    string id = Guid.NewGuid().ToString();

    using (IDbCommand command = connection.CreateCommand())
    {
        command.CommandText = "INSERT INTO [BLOB] ([Id],[Data]) VALUES (@p1,0x0)";

        SqlParameter param = new SqlParameter("@p1", SqlDbType.VarChar);
        param.Value = id;
        command.Parameters.Add(param);

        command.ExecuteNonQuery();
    }

    if (File.Exists(textBox1.Text))
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            command.CommandText = "UPDATE [BLOB] SET [Data].WRITE(@data, @offset, @len) WHERE [Id]=@id";

            SqlParameter dataParam = new SqlParameter("@data", SqlDbType.VarBinary);
            command.Parameters.Add(dataParam);

            SqlParameter offsetParam = new SqlParameter("@offset", SqlDbType.BigInt);
            command.Parameters.Add(offsetParam);

            SqlParameter lengthParam = new SqlParameter("@len", SqlDbType.BigInt);
            command.Parameters.Add(lengthParam);

            SqlParameter idParam = new SqlParameter("@id", SqlDbType.VarChar);
            command.Parameters.Add(idParam);
            idParam.Value = id;

            using (FileStream fs = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                byte[] buffer = new byte[2090400]; //chunk sizes that are multiples of 8040 bytes.
                int read = 0;
                int offset = 0;

                while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    dataParam.Value = buffer;
                    offsetParam.Value = offset;
                    lengthParam.Value = read;

                    command.ExecuteNonQuery();

                    offset += read;
                }
            }
        }
    }
}

Kann jemand mir sagen, warum er die Datei in den Speicher-Puffer? Die byte[] Puffer Ich verwende nur knapp 2 MB groß.

Ich kann einen neuen Puffer für jeden Chunk erstellen, aber das scheint wie eine Verschwendung von CPU / Speicher auch ...

War es hilfreich?

Lösung

es puffert es da, wenn man es in die Varbinary Spalte speichern sie Teil der LOB-Daten-Cache in SQL Server wird. Das ist, wie es funktioniert.

oder meinst du es woanders gepuffert wird?

Andere Tipps

Die Filestream-Klasse Puffer Eingang und Ausgang. Sie können die Flush () Methode nach jedem Update aufrufen, um die internen Puffer zu löschen.

Um klar zu sein, wird es nur in die Puffergröße puffer (4 KB).

In diesem Fall denke ich, Ihre Schuldige SqlExpress ist. Wenn ich Ihren Code ausgeführt und schrieb an meiner lokalen Kopie SqlExpress, sprang die Speichernutzung durch den sqlsrvr Prozess um ca. 1 GB. Wenn ich zu einer nicht-lokalen Datenbank geschrieben, meine Speicherauslastung stagnierte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top