如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

Posted

技术标签:

【中文标题】如何在不先加载到 RAM 的情况下将文件加载到 blob 中?【英文标题】:how to load a file into a blob without loading into RAM first? 【发布时间】:2010-03-28 21:03:53 【问题描述】:

我正在使用 C#,但无法将大文件加载到使用字节数组的二进制字段中。

基本上,如果我加载的文件太大,我会遇到内存问题。

有没有办法在不使用大量内存的情况下将文件加载到二进制字段中,即避免先将文件加载到内存中?

如果有帮助,我正在使用 Advantage Database Server,这是使用 winforms 应用程序而不是 Web 应用程序。

问候

【问题讨论】:

【参考方案1】:

AdsExtendedReader.SetBytes 可用于分块加载 blob。它封装了 Jeremy 提到的对 AdsSetBinary() 的调用。

见AdsExtendedReader.SetBytes。

【讨论】:

【参考方案2】:

您可以直接使用 Advantage Client Engine (ACE) 并调用 AdsSetBinary API 以块的形式设置 blob。对不起,我现在没有时间为你写一个例子。您需要将此原型添加到您的 c# 文件中:

[DllImport("ace32.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Winapi )]
              public static extern uint AdsSetBinary( IntPtr hTable, String pucFldName, ushort usBinaryType, uint ulTotalLength, uint ulOffset, byte[] pucBuf, uint ulLen );   

这里是 C API 参考的链接:

http://devzone.advantagedatabase.com/dz/webhelp/Advantage9.1/mergedProjects/ace/api2/adssetbinary.htm

要获取传递 API 的句柄,请参阅 AdsExtendedReader.AdsHandle 文档。

更新:我刚刚看到 Alex 的回答,它比我的要好,我不知道我们已经用 .NET 方法包装了 AdsSetBinary 调用。您可能希望将他的答案标记为该问题的正确答案。 :)

【讨论】:

【参考方案3】:

除非您选择简单地在数据库中添加对文件所在位置的引用,否则它必须首先通过内存,因此我建议您寻找一种一次加载文件 x 字节的解决方案。

【讨论】:

【参考方案4】:

我在使用“UPDATE .WRITE”之前已经完成了这项工作,我从流中读取文件的块并将数据附加到数据库字段。在此页面上搜索 .WRITE:http://msdn.microsoft.com/en-us/library/ms177523.aspx。

不幸的是,这适用于 SQL Server。我认为 Advantage Database Server 在这里会有所不同,但也许这会让您朝着正确的方向前进。

【讨论】:

以上是关于如何在不先加载到 RAM 的情况下将文件加载到 blob 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

如何在不删除源文件的情况下将数据从 HDFS 加载到配置单元?

是否可以在不先列出列表的情况下将 Series 附加到 DataFrame 行?

有啥方法可以在不使用文件的情况下将 MIDI 加载到 AKAppleSequencer 或 AKSequencer 中?

Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?

如何在不使用 .get() 或 .load() 的情况下将 ajax 数据加载到 DIV?