2013-09-11 4 views
1

Я работаю с 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, так что я могу обрабатывать его.

+0

Почему вы читаете файл в строке? Что вы ожидаете от этого? –

+0

опубликуйте некоторый код чтения клоба из оракула, тогда только мы можем что-то предложить. – Vijay

+0

Нет места для хранения всего xml в памяти за один раз. Вы можете быть вынуждены сделать что-то вроде этого: http://stackoverflow.com/a/15146498/814064 – dcaswell

ответ

0

Лучшим подходом для приложения multi-db может быть сохранение в БД только пути/ссылки на файл и сохранение этого большого блоба в файловой системе.

Смежные вопросы