- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想在 Redis 中存储复杂的对象,例如 DataTable
或 Dataset
等。我曾尝试使用 JsonSerialize
将它们序列化为 BLOB 对象,但这需要太多时间。还有其他办法吗?
最佳答案
不幸的是,在处理大型数据集时,序列化和反序列化结构总是需要时间。 DataTable
尤其是 s 是相当复杂的对象,因为它们有行和列,这些行和列通常附加有很多元数据 - 即使它看起来是一个基本表。
DataTable
对比List<POCO>
:考虑您是否真的需要序列化为 DataTable
.你能创建一个更简单的 POCO 并序列化一个 List<YourRecord>
吗? ?换句话说,如果您不需要字段和列的额外属性,并且可以序列化为更简单的格式,那么它可能会更快,并且在缓存中的空间效率更高;然后恢复到 DataTable
如有必要。
另一种选择是拆分 DataTable
分成更小的集合,您可以序列化并存储在更小的部分中。您可能会发现它的性能更高。 您应该能够对此进行基准测试。
最终,您的 Redis 缓存应该比重新查询数据源所花费的时间有所改进。您使用术语 takes too much time
,但是如果从缓存中获取数据需要 2 秒,而查询数据源需要 8 秒,那么这是一个显着的提升。但唯一可以确定的方法是进行基准测试。
设置您的环境,以便您只运行必要的工具。 在运行基准测试时不要执行其他任务,因此不会引入任何偏差。
记录序列化 DataTable
所需的时间.多次执行此操作并取平均值。
var start = DateTime.Now;
// Serialize
var duration = DateTime.Now - start;
用不同大小的 DataTable
进行实验s 看看你是否找到了一个可接受的时间。
尝试使用不同的序列化库,例如 JSON.NET。虽然保留所有 ServiceStack 很好,但这可以帮助您确定它是 ServiceStack.Text 的缺点还是仅仅是大型数据集的问题。
重复反序列化过程。
如果您正在处理大型数据集,您的应用程序和缓存是否都有足够的内存?您应用程序中的内存可能是一个瓶颈;您应该在执行操作时观察系统的事件监视器,并确保您没有用完内存并让系统执行分页。如果您发现发生这种情况,请考虑增加 RAM,或者如前所述将 DataTable 拆分为更小的数据集。
如果您通过网络连接到 Redis 服务器,而不是在同一台机器上,您是否检查过网络延迟?您可能希望在您的应用程序服务器和缓存服务器之间执行 ping 命令,并确保您的 ping 值确实很低。特别是如果您发现缓存简单对象很慢。
如果您发现没有办法缩短缓存和恢复的时间,那么使用 Redis 可能不太合适。也许使用 static DataTable
在应用内存中会更合适。换句话说,通过将缓存保留在应用程序内存中,就无需担心序列化和反序列化。当然,您可能需要小心确保您的应用程序有足够的可用内存来执行此操作。 不过,如果您必须选择此选项,我会感到很惊讶。
在没有看到您的数据集或您正在构建的服务的知识的情况下,它最终只是关于如何最好地缩小问题原因的一般性建议。关键建议是不要使用 DataTable
如果可以使用更简单的结构,并对每个操作进行基准测试以确定任何瓶颈。
希望对您有所帮助。
关于.net - 将 DataTable 序列化/反序列化到 Redis 或从 Redis 序列化/反序列化的最省时的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20898534/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!