Я работаю с asp.net и базой данных Oracle SQL.Извлечь большой файл из базы данных CLOB
У меня есть простая процедура в базе данных, которая возвращает файл (в данном случае XML-файл) на основе заданного идентификатора. В приложении .net я открываю OracleConnection и читаю файл в строке с помощью OracleDataReader.
Это работает нормально, пока размер файла не станет очень большим (360 МБ), что вызывает ошибку «System.OutOfMemoryException», которая, как я предполагаю, происходит потому, что процесс занимает более 800 мб памяти.
Есть ли лучший способ получить файл или можно увеличить ограничение на 800mb? Время здесь не проблема.
Процедура в базе данных
PROCEDURE get_xml(xml_id IN NUMBER,
p_records OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_records FOR
SELECT xml
FROM allxml
WHERE id = xml_id;
END get_xml;
C# код
using (OracleConnection oConn = new OracleConnection(ora_connection))
{
Procedure proc = null;
OracleParameter result = null;
oConn.Open();
OracleDataReader dr = null;
proc = Procedure.CreateProcedure("get_xml", oConn)
.Number("xml_id", id)
.RefCursor("p_records", out result)
.ExecuteReader(out dr);
if (dr.Read())
{
xml = dr.GetString(0);
}
}
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return doc;
Как вы можете видеть, что я загрузить файл в строку, а затем создать XML, так что я могу обрабатывать его.
Почему вы читаете файл в строке? Что вы ожидаете от этого? –
опубликуйте некоторый код чтения клоба из оракула, тогда только мы можем что-то предложить. – Vijay
Нет места для хранения всего xml в памяти за один раз. Вы можете быть вынуждены сделать что-то вроде этого: http://stackoverflow.com/a/15146498/814064 – dcaswell