Как передать XML из Delphi в C# без записи на диск?

У меня есть приложение Delphi, которое создает блок данных, которые я сейчас записываю в файловую систему в виде xml. Затем эти данные считываются приложением C# .Net для дальнейшей обработки.

Проблема в том, что граф объектов большой, а результирующий XML-файл имеет размер более 2 ГБ. Запись XML-файла занимает относительно много времени, а также его чтение.

Вместо того, чтобы писать в файловую систему, как я могу перенести данные в оперативную память, где это будет намного быстрее?

У меня есть исходный код и компиляторы для обоих приложений. Я использую .Net версии 4.0 и VS2010 для одного приложения. Другой я использую Delphi 5 (у меня есть доступ к более поздним версиям, но я не уверен, поможет ли миграция).

ОБНОВЛЕНИЕ: Спасибо за все предложения, это много для обработки. Я отправлю обратно после дальнейшего рассмотрения.


person sapbucket    schedule 04.10.2012    source источник
comment
Как насчет использования сокетов.   -  person Musa    schedule 04.10.2012
comment
В DELPHI 5 полно проблем с утечкой ПАМЯТИ... есть ли у вас доступ к Delphi 7 или выше... или Prism...?   -  person MethodMan    schedule 04.10.2012
comment
Есть много методов, которые могут достичь этого. Я предлагаю вам взглянуть на эта ссылка. Тот, который лучше для вас, во многом зависит от спецификаций вашего проекта.   -  person Sidharth Mudgal    schedule 04.10.2012
comment
у вас есть образцы кода, которые вы можете показать.. также в приложении delphi убедитесь, что в областях, где у вас есть циклы или операторы while, в этом разделе добавьте Application.ProcessMessages, также убедитесь, что вы создаете FreeAndNil (объекты), которые вы можете также посмотрите на Interop   -  person MethodMan    schedule 04.10.2012
comment
Межпроцессное взаимодействие — это то, что вам нужно. Другая возможность состоит в том, чтобы сохранить его в двоичном формате вместо XML, поскольку обработка всего XML займет довольно много времени и приведет к раздуванию данных.   -  person Eric Andres    schedule 04.10.2012
comment
Delphi 5 только 32-битная. Вы не можете получить доступ к ›2 ГБ памяти сразу. Вам придется передавать файл по частям. Как вы генерируете XML?   -  person David Heffernan    schedule 04.10.2012
comment
@DJKRAZE Предлагать добавить звонки в Application.ProcessMessages бесполезно. Я бы порекомендовал найти любые такие звонки и удалить их. Если процесс медленный, а пользовательский интерфейс необходимо поддерживать в рабочем состоянии, поместите долго выполняющийся код в фоновый поток, как и задумано природой.   -  person David Heffernan    schedule 04.10.2012
comment
Дэвид, я согласен, если это закодировано на C #, но если я не ошибаюсь, я думаю, что он спрашивал об унаследованном приложении, которое находится в Delphi 5.   -  person MethodMan    schedule 04.10.2012
comment
@DJ Delphi 5 может создавать темы   -  person David Heffernan    schedule 04.10.2012
comment
Я знаю это .. Дэвид, я думаю, что вы не знакомы с проблемами Delphi 5 ... Я позволю вам помочь / предоставить OP жизнеспособное решение .. хорошего дня   -  person MethodMan    schedule 04.10.2012
comment
@DJ Delphi 5, конечно, устарел, но это не значит, что вы должны отказаться от здравого смысла и начать вызывать Application.ProcessMessages, как программист VB6 вызывает DoEvents. И я хорошо знаком с Delphi 5, спасибо.   -  person David Heffernan    schedule 04.10.2012
comment
Приятно знать, Дэвид .. спасибо   -  person MethodMan    schedule 04.10.2012
comment
Wouter van Nifterick Ха, теги репутации ничего не значат, ты DUFS   -  person MethodMan    schedule 05.10.2012


Ответы (5)


Еще несколько предложений:

Файлы, отображаемые в память

Именованные каналы

Сокеты

RPC

ActiveX

Лично я рекомендую сокеты, используя Indy на стороне Delphi и System.Net.Sockets на стороне .NET.

person Alan Clark    schedule 04.10.2012

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

Три способа сделать это:

  • загрузить код Delphi как DLL в процессе C# (используя PInvoke)
  • загрузите код C# как управляемую сборку в свой процесс Delphi, используя обратный PInvoke
  • используйте Hydra от RemObjects, чтобы сделать одно из вышеперечисленного и обработать детали для вас

Если вы делаете это с помощью Delphi XE2 или выше, вы можете иметь все в одном 64-битном процессе и более легко выделить 2 ГБ+ памяти.

person Jeroen Wiert Pluimers    schedule 04.10.2012

Вы можете значительно ускорить это, сжимая (gzip и т. д.) поток XML, когда вы записываете его на диск, а затем распаковываете на другом конце. Не удивляйтесь, если вы получите 10-кратное уменьшение размера и, следовательно, ввода-вывода. Конечно, вы обмениваете ввод-вывод на работу ЦП, но это относительно легкая работа для ЦП.

person Chris Thornton    schedule 04.10.2012

Вы можете отправить его как сообщение SOAP.

person Chris Thornton    schedule 04.10.2012

Лучший способ, который я использую сейчас для передачи изображений из С# в Delphi со скоростью 30 кадров в секунду, это:


1- создать ac# COM LIBRARY (открывая элементы GUI)
2- зарегистрировать ac# COM LIBRARY с помощью regasm -register -tlb dllname.dll
3- загрузить библиотеку типов, созданную в delphi, и использовать c# функции отправки или получения любых данных

person Mario Sergio    schedule 21.08.2013