我正在开发一个客户端/服务器应用程序,其中服务器保存大量数据,例如客户端请求的大图像或视频文件,我需要创建一个内存客户端缓存系统来保存一些那些大数据加快了这个过程。需要明确的是,每个单独的图像或视频都不是那么大,但所有图像或视频的总体尺寸可能非常大。
但是我面临着“我应该缓存多少数据”的问题,并且想知道Windows上是否存在某种关于我应该采用什么策略的黄金规则。缓存在客户端完成,我不需要在服务器上缓存。
答案 0 :(得分:8)
不是创建自己的缓存算法,而是为什么不将数据写入具有FILE_ATTRIBUTE_TEMPORARY
属性的文件,并使用客户端计算机自己的缓存。
虽然这种方法似乎意味着你使用了一个文件,但如果系统中有可用的内存,那么该文件将永远不会离开缓存,并且会一直保留在内存中。
一些优点:
答案 1 :(得分:1)
这取决于服务器上运行的其他软件。我首先可以手动配置它。开发一个可以使用特定内存量的系统。如果可以,请构建它以便在运行时更改该值。
如果你有这些可能性,你可以尝试一些调整,看看什么效果最好。我不知道任何黄金法则,但我认为你应该能够设置总内存或总可用内存的百分比,并且系统始终具有特定的最小内存量。如果为服务器操作系统保存了500 MB的最小值,则可以使用其余的,或者其余90%用于缓存。但这些数字取决于操作系统的版本以及服务器上运行的其他应用程序。
我认为最好从外部配置数字并创建一个管理工具,让您先手动设置值。然后,如果您发现最有效的方法,可以扣除公式来计算这些值,并将它们集成到您的管理工具中。这个工具不应该是缓存程序本身的一个组成部分(无论如何它可能是一个没有GUI的服务)。
答案 2 :(得分:1)
服务器应用程序通常需要为其管理员自己使用的资源。我不关心其他应用程序的行为,我会关心是一个“礼貌”的应用程序,因此它应该允许内存缓存大小等由管理员配置,管理员是唯一知道如何正确配置他的系统的人(通常...)
默认值应该考虑到整体可用的内存量,特别是在内存小于4GB的32位系统上(只要Delphi只提供32位应用程序),为操作系统留下一些空闲内容并避免过于频繁的交换。要求用户在设置时选择它也是可取的。
如果应用程序是服务器上运行的唯一应用程序,则可用内存的40到75%之间的值可以正常(取决于缓存之外需要多少内存),但再次询问用户,因为它几乎是无法知道运行的其他应用程序可能需要什么。您还可以使用最小高速缓存大小和最大高速缓存大小,首先分配较低的值,然后在需要时增大它,并在必要时将其缩小。
在32位系统上,这是一种内存使用,可以使用PAE / AWE访问超过3GB的内存。
更新:您还可以执行缓存命中/未命中的监控,并计算最适合用户需求的缓存大小(可能太小但也太大),并提供建议关于那个用户。
答案 3 :(得分:1)
问题:
多个客户可以申请一张图片吗?或者,可以在短时间内多次请求一个图像?
间隔有多短?
网络速度真的很高?高于硬盘的速度??如果您拥有正常的网络,那么硬盘驱动器将能够从磁盘读取文件并通过网络实时传输。特别是Windows已经在进行一些良好的缓存,因此最新的文件已经在缓存中。
运行服务器应用程序的计算机的主要目的是运行服务器吗?或者只是用于其他任务的普通计算机?换句话说,它是专用服务器还是普通工作站/桌面?
但我应该问用户多少钱 记忆他愿意分配给我 申请?
我肯定会去那里! 如果用户认为服务器应用程序不是一个重要的应用程序,它可能会给它低优先级(低缓存)。此外,它认为它是最重要的运行应用程序,它将允许应用程序分配它所需的所有RAM而不利于其他不太重要的应用程序。
只需将默认情况下设置的应用程序交付给可接受的值(这将类似于RAM总量的x%)。如果计算机主要用于存放此服务器应用程序,我将使用70%的总RAM,如果其目的是“通用”计算机,则将使用约40-50%。
答案 4 :(得分:0)
说实话,你提出的问题不是我主要关注的问题。我会更关心我的缓存有多高效。如果你的文件非常大,你可以在缓存中保留多少文件?如果您的客户端服务器应用程序有很多用户,那么您的缓存实际缓存其他人将使用的内容的可能性有多大?
在精细细节上花费太多时间之前,可能值得进行分析。