2011-06-10 267 views
6

我正在开发一个客户端/服务器应用程序,其中服务器端保存大量数据,例如客户端请求的大图片或视频文件,我需要创建一个内存中客户端缓存系统来保存这些数据大数据来加速这个过程。要清楚的是,每个单独的图像或视频都不是那么大,但它们的整体尺寸可能非常大。缓存系统应该在Windows上使用多少内存?

但是我面临着“我应该缓存多少数据”的问题,并且想知道在Windows上有什么黄金规则应该采用什么策略。缓存是在客户端完成的,我不需要在服务器上缓存。

  1. 我应该一直呆在全局内存使用量的x%以下吗?那会是多少?如果另一个程序启动并占用大量内存,应该如何清空缓存?
  2. 我应该在缓存之前请求多少可用内存,并根据需要使用该内存的固定百分比?
  3. 我希望我不必去那里,但我应该问用户他愿意分配给我的应用程序多少内存?如果是这样,我如何计算该属性的默认值以及那些永远不会使用该设置的人?
+0

那么,一个图像可以由多个客户端请求?或者,可以在10分钟内多次请求一张图像? – Ampere 2011-06-10 11:32:19

+0

图像可以由多个客户端请求,并在10分钟内多次请求,但我认为这是无关紧要的,因为我需要客户端而不是服务器的缓存策略。 – jonjbar 2011-06-10 11:42:33

+0

我不明白。在服务器端,你想为每个客户端创建一个单独的缓存? – Ampere 2011-06-10 11:44:46

回答

8

与其创建自己的缓存算法,不如将数据写入具有FILE_ATTRIBUTE_TEMPORARY属性的文件,并利用客户端计算机自己的缓存。

尽管这种方法似乎意味着您使用了一个文件,但如果系统中有可用内存,那么该文件将永远不会离开缓存并且一直保留在内存中。

一些优点:

  • 你不需要编写任何代码。
  • 系统缓存考虑到所有其他正在运行的进程。你自己采取这种做法是不切实际的。
  • 在64位Windows上,系统可以将所有可用的内存用于缓存。在32位德尔福进程中,你被限制在32位地址空间。
  • 即使缓存已满并且文件被刷新到磁盘,本地磁盘访问也比查询数据库然后通过网络传输文件快得多。
+1

这是非常有趣的,但我有点担心防病毒扫描仪,正如在下面的文章中提到的,它减缓了这个过程:http://stackoverflow.com/questions/5242676/using-file-attribute-temporary -and-file-flag-delete-on-close – jonjbar 2011-06-10 09:22:24

+3

你只写了一次,大概读过很多次。病毒扫描程序,如果它扫描文件,将占用时间的一小部分。如果您在代码中的热循环中一遍又一遍地写入文件,那么您可能会遇到问题。缓存的重点在于你不经常写入,但更频繁地读取它。 – 2011-06-10 09:43:35

+0

@John - 您可以放置​​一个异常,以防antivir不会扫描您的共享/缓存文件。 – Ampere 2011-06-10 11:47:16

1

这取决于服务器上运行的其他软件。我可以首先手动配置它。开发一个可以使用特定数量内存的系统。如果可以,请构建它,以便在运行时更改该值。

如果你有这些可能性,你可以尝试一些调整,看看什么效果最好。我不知道任何黄金法则,但我想你应该能够设置总内存或总可用内存的百分比,并且具有特定的最小内存量,以便系统始终可以免费使用。如果您为服务器操作系统保存了500 MB的最小值,则可以使用其余部分,或其余90%用于缓存。但是这些数字取决于操作系统的版本和服务器上运行的其他应用程序。

我认为最好从外部对数字进行配置,并创建一个管理工具,让您可以先手动设置数值。然后,如果你发现什么效果最好,你可以推导公式来计算这些值,并将它们集成到管理工具中。这个工具不应该是缓存程序本身的一个组成部分(这可能是一个没有GUI的服务)。

+1

这个策略是将一小部分留给系统并使用剩余部分(在这里你说的是90%)并不是重新确定的。内存碎片可能会减少缓存的可用空间。 – az01 2011-06-10 08:48:13

+0

感谢你们双方的意见。 – jonjbar 2011-06-10 12:10:49

0

说实话,你问的问题不是我最关心的问题。我会更关心缓存的有效性。如果你的文件真的很大,你可以保存多少个缓存?如果您的客户端服务器应用程序拥有多个用户,那么您的缓存实际上会缓存其他人将使用的内容的可能性有多大?

在你花费太多精力细节之前,先做一个分析可能是值得的。

+0

缓存由客户端完成,因此每个客户端都拥有自己的缓存。关于文件大小,每一个都不是那么大,但是把它们全部放在客户端缓存中的附加内存是问题,因此我的问题是我应该在客户端分配多少缓存。 – jonjbar 2011-06-10 08:48:32

1

服务器应用程序通常需要为管理员自己使用而预留的资源。我不关心其他应用程序的行为,我会关心做一个“礼貌”的应用程序,因此它应该允许内存缓存大小等由管理员配置,这是唯一知道如何正确配置他的系统的人(通常是......)

默认值应该考虑整体上有多少内存可用,尤其是对于内存少于4GB的32位系统(只要Delphi只提供32位应用程序),要留下一些东西免费使用操作系统,避免太频繁的交换。要求用户在安装时选择它也是可取的。

如果应用程序是服务器上唯一运行的应用程序,则可用内存的40%到75%之间的值可能是正确的(取决于超出缓存需要多少内存),但再次询问用户是因为它几乎不可能知道运行其他应用程序可能需要什么。您还可以拥有最小缓存大小和最大缓存大小,首先分配较低的值,然后在需要时增大容量,并在必要时缩小容量。

在32位系统上,这是一种内存使用情况,可以从使用PAE/AWE访问超过3GB的内存中受益。

更新:您还可以执行缓存命中/未命中监视并计算哪个缓存大小最适合用户需要(它可能太小但太大),并提醒用户注意。

+0

谢谢您的输入。 – jonjbar 2011-06-10 12:12:03

+0

如果缓存在客户端同样的考虑appy,让用户选择最适合他的设置(像Photoshop这样的应用程序有像这样的配置选项)。如果应用程序是用户在特定时间使用的主应用程序,它将乐意尽可能多地允许内存尽可能高效地工作,但是只有用户可以知道多少是可以的。此外,这个应用程序是针对“专业”用户还是“休闲”用户?前者通常需要控制,后者可能需要更多指导和自动计算的值。 – 2011-06-10 12:32:57

1

问题:

  1. 一个图像可以被多个客户端请求?或者,可以在短时间内多次请求一张图像?

  2. 间隔有多短?

  3. 网络的速度真的很高?高于硬盘的速度?如果你有一个正常的网络,那么硬盘将能够从磁盘读取文件并实时通过网络传送它们。特别是Windows已经在做一些很好的缓存,所以最新的文件已经在缓存中。

  4. 运行服务器应用程序的计算机的主要目的是运行服务器?或者只是一台普通的电脑也用于其他任务?换句话说,它是一个专用的服务器还是一个普通的工作站/桌面?

,但我要问他是多少 内存愿意分配给我的 应用程序的用户?

我肯定会去那里! 如果用户认为服务器应用程序不是一个重要的应用程序,它可能会给它低优先级(低缓存)。否则,它认为它是最重要的运行应用程序,它将允许应用程序分配它所需的所有RAM,而不利于其他不太重要的应用程序。

只需将该设置默认设置为可接受的值(这将是RAM总量的x%)即可。如果计算机的主要目的是保存这个服务器应用程序,我将使用像总内存的70%,如果其目的是“一般使用”的计算机,则使用约40-50%。

+0

如上所述,我需要一个客户端缓存系统,其中从服务器“下载”的数据被缓存以便快速访问。感谢您的输入。 – jonjbar 2011-06-10 12:10:09