如何在不写入磁盘的情况下将 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