在多处理环境中读取文件的最快方法? C#

Fastest way to read files in a multi-processing environment? C#

我面临以下挑战:

我有一个包含许多实例的 Azure 云辅助角色。每分钟,每个实例都会启动大约 20-30 个线程。在每个线程中,它需要从 3 个对象中读取一些关于如何处理线程的元数据。 objects/data 驻留在远程 RavenDb 中,尽管 RavenDb 通过 HTTP 检索对象的速度非常快,但它仍然承受着 30 多个工作人员的相当大的负载,每个线程每分钟访问它 3 次(大约 45 requests/sec).大多数时候(比如 99.999%)RavenDb 中的数据不会改变。

我决定实施本地存储缓存。首先,我读取了一条指示元数据是否已更改的小记录(它很少更改),然后我从本地文件存储而不是 RavenDb 读取,如果本地存储缓存了对象。我正在使用 File.ReadAllText()

这种方法似乎会使机器停滞不前,并且处理速度会大大降低。我猜 "Small" 辅助角色上的磁盘速度不够快。

无论如何,我可以 OS 帮我缓存那些文件吗?也许有缓存此数据的替代方法?

我正在查看每个 Cloud Role 实例上存储的大约 1000 个大小不一的文件,大小从 100k 到 10mb 不等

不是直接的答案,而是三个可能的选项:

使用内置的RavenDB缓存机制

我最初的猜测是您的缓存机制实际上会影响性能。 RavenDB 客户端内置了缓存(有关如何对其进行微调,请参见此处:https://ravendb.net/docs/article-page/3.5/csharp/client-api/how-to/setup-aggressive-caching

您遇到的问题是缓存对于每台服务器都是本地的。如果服务器A之前下载了一个文件,如果下次服务器B恰好处理该文件,仍然需要获取它。

您可以实施的一个可能的选择是划分工作量。例如:

  • 服务器 A => 获取以 A-D 开头的文件
  • 服务器 B => 获取以 E-H 开头的文件
  • 服务器 C => ...

这将确保您优化每台服务器上的缓存。

换台更大的机器

如果您仍想使用自己的缓存机制,我认为有两件事可能是瓶颈:

  • 磁盘访问
  • 反序列化 JSON

对于这些问题,我唯一能想到的就是获得更大的资源:

  • 如果是磁盘,请使用带有 SSD 的高级存储。
  • 如果是反序列化,请使用更大的 VM CPU

在 RAM 中缓存文件

或者,不是将文件写入磁盘,而是将它们存储在内存中并获得具有更多 RAM 的 VM。您不需要那么多 RAM,因为 1000 个文件 * 10MB 仍然只有 1 GB。这样做将消除磁盘访问和反序列化。

但最终,最好首先衡量瓶颈在哪里,看看是否可以通过使用 RavenDB 的内置缓存机制来缓解它。