Как мога да предам XML от Delphi към C# без запис на диск?

Имам приложение на Delphi, което създава петно ​​от данни, които в момента записвам във файлова система като xml. След това тези данни се четат от C# .Net приложение за по-нататъшна обработка.

Проблемът е, че обектната графика е голяма и полученият xml файл е с размер 2 GB+. Записването на xml файла, а също и четенето му отнема сравнително дълго време.

Вместо да пиша във файловата система, как мога да прехвърля данните в RAM, където ще бъде много по-бързо?

Имам изходен код и компилатори и за двете приложения. Използвам .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(Objects), които създавате, можете също погледнете Interop   -  person MethodMan    schedule 04.10.2012
comment
Комуникацията между процесите е това, което търсите. Друга възможност е да го запишете в двоичен формат вместо XML, тъй като обработката на целия XML ще отнеме доста време и ще раздуе данните.   -  person Eric Andres    schedule 04.10.2012
comment
Delphi 5 е само 32 бита. Не можете да получите достъп до ›2GB памет наведнъж. Ще трябва да прехвърлите файла на части. Как генерирате 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-битов процес и по-лесно да разпределите 2GB+ памет.

person Jeroen Wiert Pluimers    schedule 04.10.2012

Може да успеете да ускорите това значително, като компресирате (gzip и т.н.) XML потока, докато го записвате на диска, след което декомпресирате от другата страна. Не се изненадвайте, ако получите 10 пъти намаление на размера и следователно I/O. Разбира се, вие разменяте I/O за работа на процесора, но това е относително лесна работа за процесора.

person Chris Thornton    schedule 04.10.2012

Можете да го изпратите като SOAP съобщение.

person Chris Thornton    schedule 04.10.2012

Най-добрият начин, който го използвам сега за прехвърляне на изображения от c# към delphi при 30fps е:


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

person Mario Sergio    schedule 21.08.2013