【问题标题】:Inserting large blob (bigger than memory) to SQLite将大 blob(大于内存)插入 SQLite
【发布时间】:2017-03-20 13:38:49
【问题描述】:

请不要问我为什么要向数据库写入一个 13GB(或更多)的文件 - 这正是我必须这样做的野兽的本性。

我的问题是我认为它会将其全部加载到内存中,我不想这样做,我需要使用尽可能少的内存将其分块或即时流式传输到 blob。

这是我目前拥有的代码:

Using fs As New System.IO.FileStream(InPutFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
    Using sr As New System.IO.StreamReader(fs)
        Dim data(fs.Length - 1) As Byte
        fs.Read(data, 0, fs.Length)
        Using cmd As New SQLite.SQLiteCommand(TSQLDB)
            data = IO.File.ReadAllBytes(InPutFile)
            cmd.CommandText = "UPDATE [FileSpace] SET [FileData]=@DAT WHERE [ID]=" & MyID
            cmd.Prepare()
            cmd.Parameters.Add("@DAT", DbType.Binary, fs.Length)
            cmd.Parameters("@DAT").Value = data
            cmd.ExecuteNonQuery()
            cmd.Dispose()
        End Using
        data = Nothing
    End Using
End Using

任何帮助将不胜感激 :) 谢谢!

【问题讨论】:

  • 你能不能创建一个存储过程来获取一个块并将其附加到已经存储在该字段中的数据上?
  • 使用SQLiteBlob object。请注意,这不能改变 blob 的大小;首先使用 zeroblob() 创建 blob 值。

标签: vb.net sqlite blob


【解决方案1】:

我认为 SQLite 可能存在限制 - 仅查看 sqlite.org 网站,blob 限制为 2147483647 字节,仅相当于大约 2GB。我找到了一个命令:SQLITE_LIMIT_LENGTH

我认为解决此问题的唯一另一种方法是我插入它是将文件拆分为 2GB 块并以这种方式插入它们,然后在保存时将 blob 重新连接到一个文件中。没有什么是容易的! - 不过感谢 cmets - 它让我深思熟虑,让我找到了这个可能的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2014-11-26
    • 1970-01-01
    • 2015-01-14
    • 2020-04-21
    • 2013-03-21
    • 1970-01-01
    • 2013-06-06
    相关资源
    最近更新 更多