gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:38:05 25 4
gpt4 key购买 nike

我有以下挑战:

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

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

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

无论如何,我可以让操作系统帮助我缓存这些文件吗?也许有替代缓存此数据的方法?

我正在查看存储在每个 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 的高级存储。
  • 如果是反序列化,请使用更大 CPU 的 VM

在 RAM 中缓存文件

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

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

关于c# - 在多处理环境中读取文件的最快方法? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com