如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?

Posted

技术标签:

【中文标题】如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?【英文标题】:How can I pass XML from Delphi to C# without writing to disk? 【发布时间】:2012-10-04 16:12:13 【问题描述】:

我有一个 Delphi 应用程序,它产生一个数据块,我目前正以 xml 格式写入文件系统。然后由 C# .Net 应用程序读取此数据以进行进一步处理。

问题在于对象图很大,生成的 xml 文件大小超过 2 GB。 xml文件写入时间比较长,读取时间也比较长。

我怎样才能将数据传输到 RAM 中,而不是写入文件系统,这样会更快?

我有两个应用程序的源代码和编译器。我正在为一个应用程序使用 .Net 4.0 版和 VS2010。另一个我正在使用 Delphi 5(我可以访问更高版本,但我不确定迁移是否会有所帮助)。

更新:感谢所有建议,需要处理的内容很多。我会在进一步审查后回复。

【问题讨论】:

如何使用套接字。 DELPHI 5 充满了大量的 MEMORY 泄漏问题.. 您是否可以访问 Delphi 7 或更高版本.. 或 Prism..? 有很多方法可以实现这一点。我建议你看看this link。最适合您的方案在很大程度上取决于您的项目规范。 @DJKRAZE 建议添加对Application.ProcessMessages 的调用没有帮助。我的建议是找到任何此类电话并将其删除。如果进程很慢并且需要保持 UI 处于活动状态,请按照本意将长时间运行的代码置于后台线程中。 @DJ Delphi 5 确实已经过时了,但这并不意味着您必须放弃常识并开始调用 Application.ProcessMessages,就像 VB6 程序员调用 DoEvents 一样。我对 Delphi 5 非常熟悉,谢谢。 【参考方案1】:

更多建议:

Memory Mapped Files

Named Pipes

Sockets

RPC

ActiveX

我个人的建议是套接字,在 Delphi 端使用 Indy,在 .NET 端使用 System.Net.Sockets。

【讨论】:

【参考方案2】:

您可以将两者集成到一个进程中。这会给您带来速度优势,因为您不需要任何进程间通信。

三种方法:

在 C# 进程中将 Delphi 代码作为 DLL 加载(使用 PInvoke) 使用inverse PInvoke将C#代码作为托管程序集加载到您的Delphi进程中 使用 RemObjects 中的Hydra 执行上述操作之一,并为您处理详细信息

如果您使用 Delphi XE2 或更高版本执行此操作,您可以将所有内容都放在一个 64 位进程中,并更轻松地分配 2GB 以上的内存。

【讨论】:

【参考方案3】:

您可以通过在将 XML 流写入磁盘时对其进行压缩(gzip 等)然后在另一端解压缩来显着加快这一速度。如果您的尺寸减少了 10 倍,因此 I/O 减少了 10 倍,请不要感到惊讶。当然,您是在用 I/O 来换取 CPU 工作,但这对 CPU 来说相对容易。

【讨论】:

【参考方案4】:

您可以将其作为 SOAP 消息发送。

【讨论】:

【参考方案5】:

最好的方法,我现在用它以 30fps 将图像从 c# 传输到 delphi 是:

1- 在创建一个 c# COM LIBRARY(暴露 GUI 元素) 2- 使用 regasm -register -tlb dllname.dll 注册一个 c# COM LIBRARY 3- 加载在 delphi 中创建的类型库并使用 c# 函数发送或检索任何数据

【讨论】:

以上是关于如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不写入磁盘的情况下将 AWS S3 上的文本文件导入 pandas

如何在不将 csv 保存到磁盘的情况下将 csv 格式的数据从内存发送到数据库?

如何在不使用 BIOS 的情况下将数据写入显卡?

如何在不覆盖现有记录的情况下将新行添加到数据表

如何在不复制列标签的情况下将多个数据框写入同一张表

如何在不知道编码的情况下将字节写入 Python 3 中的文件?