【问题标题】:Async usage for Loading/Saving a list of objects to files将对象列表加载/保存到文件的异步用法
【发布时间】:2016-09-21 18:59:56
【问题描述】:

假设我有一个同类对象列表打包到一个文件中,我在应用程序启动时保存到/加载。

我想做的是使用异步处理的力量来加速加载所有时间和保存所有时间 - 我们还假设文件本身被有效打包(使用协议缓冲区等)。

最好的方法是什么?在这种情况下,异步处理真的有帮助吗?

我想到的一种方法是“预先确定”分块的数量,方法是选择一个大于 1 的数字,将列表除以该数字,然后使用该数字作为任务数进行保存/加载。但是,这似乎有些武断,我很好奇是否有一些库可以根据某些条件为我做出决定。

即我可以将我的“可分块列表”称为:

Chunkable<List<SomeObject>>

.. 然后程序将正确划分列表以有效地读取/保存 - 例如保存 10 个文件,如“List_01”、“List_XX” - 然后在执行全部加载时从块中读取。

在保存或加载时,列表的最终顺序并不重要 - 只是将对象作为单个列表可用。

【问题讨论】:

  • 瓶颈究竟是 CPU 还是 IO?因为将 IO 分散到多个文件中不太可能加快速度...
  • 一个有用的评论,&在这个例子中我想我不确定 - 但为了论证,假设它是 CPU - 即有一些合理的处理量可以将序列化格式翻译回来成一大块对象。
  • 您可能想查看任务并行库(Parallel.ForEach 等)以及 TPL 数据流。
  • 这实际上是我到达这里的方式 - 以 save-all 为例 - 假设我使用 Task Parallel Lib 进行序列化(解决 CPU 位),但现在我必须等待一切完成编写文件 - 在完成时将内容写到单独的文件中不是更好吗?这就是让我有点困惑的地方 - 我应该预先确定文件的数量 - 还是我在考虑 IO 错误?
  • 我希望您能够使用 TPL 完成这一切,但我现在没有时间确切检查哪个调用。顺序无关紧要非常方便...这可能使其成为 TPL 数据流的更好目标...基本上每个文件一个块...

标签: multithreading asynchronous io parallel-processing


【解决方案1】:

对于后代,这里的一个概念性答案是使用任务并行库中的分区器。

为了保存,我可以让 Partitioner 序列化列表的各个部分并写出文件,因为任务以给定的非重复格式完成。

对于加载,我可以获得磁盘上给定位置中现有块的计数/列表,然后让 TPL 加载并反序列化所有块并以它们完成的任何顺序重新组合它们(使用一些 Interlocked var 确保每个文件只读取一次)。

我测试了一些代码后会在这里粘贴代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-10-11
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多