C# 将多个动态生成的正则表达式缓存到磁盘

C# 将多个动态生成的正则表达式缓存到磁盘,c#,regex,caching,C#,Regex,Caching,我有一个我正在开发的程序,它使用大量>100个动态生成的正则表达式。根据具体情况,每个正则表达式都被用于大量字符串,这可能大于2k,因此我对它们进行了编译,并在内部缓存它们的使用。但是,程序会重复运行,因为它是构建工具的一部分,每次程序启动时,编译这些动态生成的表达式都会花费大量时间。我已经有了一个磁盘缓存,如果缓存是有效的,则不需要解析,并且可以在其中存储编译的正则表达式,但是我似乎无法找到正确的方法。我首先想到使用Regex.CompileToAssembly,但Mono不支持它,程序需要在

我有一个我正在开发的程序,它使用大量>100个动态生成的正则表达式。根据具体情况,每个正则表达式都被用于大量字符串,这可能大于2k,因此我对它们进行了编译,并在内部缓存它们的使用。但是,程序会重复运行,因为它是构建工具的一部分,每次程序启动时,编译这些动态生成的表达式都会花费大量时间。我已经有了一个磁盘缓存,如果缓存是有效的,则不需要解析,并且可以在其中存储编译的正则表达式,但是我似乎无法找到正确的方法。我首先想到使用Regex.CompileToAssembly,但Mono不支持它,程序需要在Mono和MS.net上运行。因此,我无法找到缓存表达式的好方法。我只需要编译的正则表达式中的IsMatchstring方法,我可以选择修改Mono正则表达式实现并将其包含在我的程序中,但我不知道从何处开始。

您可以创建另一个程序,该程序将在构建步骤中编译表达式。然后在项目中提供已编译的程序集。这将消除Mono上不支持Regex.CompileToAssembly的问题。

您可以创建另一个程序,该程序将在构建步骤中编译表达式。然后在项目中提供已编译的程序集。这将消除Mono上不受支持的Regex.CompileToAssembly的问题。

这不是一个完整的解决方案,但我能够使用二进制序列化来显著缩短带缓存与不带缓存的启动时间。我怀疑这实际上只是节省了解析正则表达式的时间,而且它仍然需要进行实际编译,但这对于我的需要来说已经足够好了。

这不是一个完整的解决方案,但我能够使用二进制序列化来显著提高带缓存与不带缓存的启动时间。我怀疑这大部分实际上只是它节省了解析正则表达式的时间,它仍然需要进行实际编译,但这对于我的需要来说已经足够了。

不幸的是,由于正则表达式是在运行时生成的,所以这不是一个选项。然后创建一个托管在Windows上的远程编译服务,这将从正则表达式字符串中返回程序集:我上次检查过,所有现有的构建工具这实际上与标准make类似,但具有允许单个makefile用于多个平台的功能,不需要internet连接即可正常工作。另外,编译程序集所依赖的函数在mono中没有实现异常。我只是在想一些想法。嗯,那么我只看到一个选项,但你也不会喜欢它:用自定义搜索代码替换你的正则表达式,按你需要的方式生成并动态编译。不幸的是,由于正则表达式是在运行时生成的,所以这不是一个选项。然后创建一个托管在Windows上的远程编译服务,这将从正则表达式字符串中返回程序集:我上次检查过,所有现有的构建工具这实际上与标准make类似,但具有允许单个makefile用于多个平台的功能,不需要internet连接即可正常工作。另外,编译程序集所依赖的函数在mono中没有实现异常。我只是在想一些想法。嗯,那么我只看到一个选项,但你也不会喜欢它:用自定义搜索代码替换你的正则表达式,以你需要的方式生成它,并动态编译。