Обработка строк более 2 ГБ - PullRequest
       4

Обработка строк более 2 ГБ

3 голосов
/ 05 сентября 2011

У меня есть приложение, в котором открывается файл XLS с большим количеством данных, введенных пользователем, и данные в нем преобразуются в XML. Я уже сопоставил столбцы в файле XLS с XML-картами. Когда я пытаюсь использовать метод ExportXml в XMLMaps, я получаю строку с правильным XML-представлением файла XLS. Я немного разбираю эту строку и загружаю ее на свой сервер.

Проблема в том, что, когда мой файл XLS действительно большой, строка, созданная для XML, занимает более 2 ГБ, и я получаю исключение «Недостаточно памяти». Я понимаю, что ограничение для объектов CLR составляет 2 ГБ. Но в моем случае мне нужно справиться с этим сценарием. В настоящее время я просто сообщение с просьбой отправить меньше данных.

Есть идеи, как мне это сделать?

EDIT:

Это просто последовательность операций, которые мне нужно выполнить над сгенерированным XML.

  • Удалить некоторые поля, которые не нужны для данных сервера.
  • Добавьте что-то вроде идентификационных номеров для каждой строки данных.
  • Изменить значения определенных элементов.
  • Провести проверку данных.

Хотя поток XMLReader является хорошей идеей, я не могу выполнить эти операции этим методом. В то время как проверка данных может быть выполнена самим Excel, другие вещи не могут быть сделаны здесь.

Использование XMLTextReader и XMLTextWriter и создание собственного метода для каждого шага - это решение, о котором я думал. Но чтобы пройти вышеописанный список, требуется, чтобы документ XML был пройден или обработан 4 раза. Это просто не эффективно.

Ответы [ 3 ]

5 голосов
/ 05 сентября 2011

Если размер XML настолько велик, вы можете использовать экспорт во временный файл, а не использовать ExportXML в строку - http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xmlmap.export.aspx

Если вам необходимо проанализировать / обработать XML в C #, то для обработки таких больших XML-структур вам, вероятно, будет лучше реализовать собственный XMLReader (или XMLWriter), который работает на уровне потока. Посмотрите этот вопрос, чтобы найти несколько похожих советов: Как лучше всего анализировать большой XML (размер 1 ГБ) в C #?

0 голосов
/ 05 сентября 2011

Что вам нужно сделать, это использовать «цепочку потоков», то есть вы открываете входной поток, который читает из файла Excel, и выходной поток, который записывает в ваш файл XML. Тогда ваш класс / метод преобразования примет два потока в качестве входных данных и прочитает достаточное количество данных из входного потока, чтобы иметь возможность записи в выходной файл.

Редактировать: очень простой минимальный пример

Преобразование из файла:

  123
  1244125
  345345345 
  4566
  11 

до

  <List>
      <ListItem>123</ListItem>
      <ListItem>1244125</ListItem>
      ...
  </List>

1011 * используя *

  void Convert(Stream fromStream, Stream toStream)
  {
     using(StreamReader from= new StreamReader(fromStream))
     using(StreamWriter to = new StreamWriter(toStream))
     {
        to.WriteLine("<List>");
        while(!from.EndOfStream)
        {
            string bulk = from.ReadLine(); //in this case, a single line is sufficient
            //some code to parse the bulk or clean it up, e.g. remove '\r\n' 
            to.WriteLine(string.Format("<ListItem>{0}</ListItem>", bulk));
        }
        to.WriteLine("</List>"); 
      }

  }

  Convert(File.OpenRead("source.xls"), File.OpenWrite("source.xml"));

Конечно, вы можете сделать это гораздо более изящно, абстрактно, но это только для того, чтобы показать мою точку зрения

0 голосов
/ 05 сентября 2011

Я полагаю, что нет другого пути, кроме использования x64-OS и FX, если вам действительно нужно хранить все это в оперативной памяти, но использование другого способа обработки данных, как это предложил Стюарт, может оказаться лучшим способом. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...