缓存系统应该在Windows上使用多少内存?

jon*_*bar 7 windows delphi caching memory-management cache-control

我正在开发一个客户端/服务器应用程序,其中服务器保存大量数据,如客户端请求的大图像或视频文件,我需要创建一个内存客户端缓存系统来保存一些大数据加快这个过程.需要明确的是,每个单独的图像或视频都不是那么大,但所有图像或视频的总体尺寸可能非常大.

但是我面临着"我应该缓存多少数据"的问题,并且想知道Windows上是否存在某种关于我应该采用什么策略的黄金规则.缓存是在客户端完成的,我不需要在服务器上进行缓存.

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

Dav*_*nan 8

为什么不将数据写入具有该FILE_ATTRIBUTE_TEMPORARY属性的文件并使用客户端计算机自己的缓存,而不是创建自己的缓存算法.

虽然这种方法似乎暗示您使用文件,但如果系统中有可用内存,则该文件将永远不会离开缓存并始终保留在内存中.

一些优点:

  • 您不需要编写任何代码.
  • 系统缓存会考虑所有其他正在运行的进程.你自己承担这一点是不切实际的.
  • 在64位Windows上,系统可以使用可用于缓存的所有内存.在32位Delphi进程中,您只能使用32位地址空间.
  • 即使您的缓存已满并且您的文件被刷新到磁盘,本地磁盘访问也比查询数据库然后通过网络传输文件快得多.

  • 你只写一次,大概读了很多次.病毒扫描程序,如果它扫描文件,将花费一小部分时间.如果您在代码的热循环中反复写入文件,那么您可能会遇到问题.缓存的重点在于您不经常写入,但更频繁地读取它. (3认同)
  • @ldsandon,你所说的可能适合服务器应用程序,因为那些被允许是自私的(即:抓住尽可能多的非分页内存,不管其他应用程序;如果没有足够的RAM,管理员应该再添加一些).在桌面/客户端方面,事情不会那样,用户可能实际上同时运行多个应用程序,所有人都愿意获得尽可能多的缓存.试想一下,你的Web浏览器为它的缓存分配了大量的非缓存内存,因为它真的"想要控制".我马上就把它加工了! (2认同)