PostgreSQL 9.1
NPGSQL 2.0.12
我想将二进制数据存储在 postgresql 数据库中。大多数文件加载良好,但是,大型二进制 (664 Mb) 文件会导致问题。当尝试通过 Npgsql 使用大对象支持将文件加载到 postgresql 时,postgresql 服务器返回“内存不足”错误。
我目前在具有 4Gb RAM 的工作站上运行此程序,其中 2Gb 可用,postgresql 在空闲状态下运行。
这是我正在使用的代码,改编自PG Foundry Npgsql 用户手册 http://npgsql.projects.pgfoundry.org/docs/manual/UserManual.html.
using (var transaction = connection.BeginTransaction())
{
try
{
var manager = new NpgsqlTypes.LargeObjectManager(connection);
var noid = manager.Create(NpgsqlTypes.LargeObjectManager.READWRITE);
var lo = manager.Open(noid, NpgsqlTypes.LargeObjectManager.READWRITE);
lo.Write(BinaryData);
lo.Close();
transaction.Commit();
return noid;
}
catch
{
transaction.Rollback();
throw;
}
}
我尝试将 postgresql 的内存设置从默认值修改为各种值调整方式:
到目前为止,我发现 postgresql 是一个很棒的数据库系统,但目前这是一个阻碍,我似乎无法将这个大小的文件放入数据库。如果我可以帮助的话,我真的不想手动将文件切成块并重新创建客户端。
请帮忙!?
我认为答案似乎是使用字节数组块迭代调用 LargeObject 类的 Write() 方法。我知道我说过我不想处理数据分块,但我真正的意思是将数据分块到单独的大型对象中。这一解决方案意味着我对数组进行分块,但它仍然作为一个对象存储在数据库中,这意味着我不必跟踪文件部分,只需跟踪一个 oid。
do
{
var length = 1000;
if (i + length > BinaryData.Length) length = BinaryData.Length - i;
byte[] chunk = new byte[length];
Array.Copy(BinaryData, i, chunk, 0, length);
lo.Write(chunk, 0, length);
i += length;
} (i < BinaryData.Length)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)