我正在嘗試創建一個測試應用程序,該應用程序讀取FileStream的塊並將其附加到SQL Server 2005 Express上的VarBinary(max)列。SQL:依次在VarBinary列上執行UPDATE.WRITE
一切正常 - 列被填滿,因爲它應該是,但我的機器似乎仍然緩衝一切到內存中,我只是不明白爲什麼。
我用下面的代碼(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][email protected]";
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;
}
}
}
}
}
任何人能告訴我,爲什麼它會緩存文件到內存?我使用的byte[]
緩衝區大小僅爲2 MB。
我可以替每個塊一個新的緩衝區,但是,似乎是CPU /內存還浪費...
嗯,我的意思是它緩衝到我的機器內存。如果我嘗試將1GB文件保存到列中,則最終會使用1GB的物理內存。 由於SQL服務器並沒有將所有的內容都保存在RAM中,所以我猜測我的代碼必須有錯誤... – d0rk 2009-12-21 21:13:15
sql server會盡可能多地保存RAM中的數據。所以如果可以的話,它會將1Gb Lob保留在內存中。測試這個只需重新啓動sql服務器服務,檢查mem,重新讀取varbinary列並再次檢查mem。 – 2009-12-21 23:49:13
我剛剛使用非本地SQL服務器進行了測試,結果你是對的。沒有什麼緩衝在我的結尾,但有時在服務器上有一點。 感謝您的幫助! – d0rk 2009-12-22 16:13:10