使用SQL数据库存储大数据文件(CSV文件为1 GB)的可能方法是什么?使用WCF将数据从数据库传输到客户端(不在内存中提取完整数据)?
答案 0 :(得分:0)
我认为这里有一些问题需要考虑:
从您的问题来看,您可能希望存储1 GB的结构化(CSV)数据并将其流式传输到客户端。如果你真的在生成然后提供1GB文件(并且周围没有很多元数据),那我就去使用FTP / SFTP服务器(或者可能是网络文件共享,这当然可以是以各种方式保护)。
如果您需要存储超出其文件名/创建时间/位置的文件的元数据,那么SQL可能是一个不错的选择,假设您可以执行以下操作之一:
FILESTREAM
并自行存储文件 Here is a decent primer on FILESTREAM from SimpleTalk。然后,您可以使用SqlFileStream
来帮助从文件本身流式传输数据(SQL Server将帮助您保持事务一致性,您可能需要或可能不需要),其中的一个示例存在于{{ 3}}。相关部分如下:
private static void ReadFilestream(SqlConnectionStringBuilder connStringBuilder)
{
using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);
SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
command.Transaction = tran;
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// Get the pointer for the file
string path = reader.GetString(0);
byte[] transactionContext = reader.GetSqlBytes(1).Buffer;
// Create the SqlFileStream
using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Read, FileOptions.SequentialScan, allocationSize: 0))
{
// Read the contents as bytes and write them to the console
for (long index = 0; index < fileStream.Length; index++)
{
Console.WriteLine(fileStream.ReadByte());
}
}
}
}
tran.Commit();
}
}
或者,如果您确实选择以表格格式存储它,则可以使用典型的SqlDataReader
方法,或者bcp
和.NET帮助程序的某种组合。
您应该能够将最后一个链接与documentation结合使用,以获得所需的结果。