2016-09-21 58 views
0

比方说,我有一个相同类对象的列表打包成一个文件,我保存到/从应用程序启动加载。异步用法加载/保存对象列表到文件

我想要做的是使用异步处理的功能来加速加载 - 所有时间&节省所有时间 - 我们还假设文件本身被高效打包(使用协议缓冲区等)。

什么是最好的方式去做这件事?在这种情况下,异步处理会有帮助吗?

我想到的一种方法是通过选取大于1的数字,将列表除以该数字,然后使用该数字作为任务数量来保存/加载,从而“预先确定”分块的数量。然而,这似乎有点武断,我很好奇,如果有一些图书馆可能只是根据一些条件为我做出决定。

I.e.我会叫我“chunkable名单”是这样的:

Chunkable<List<SomeObject>> 

..然后该程序将只瓜分列表正确的读/保存以高效的方式 - 例如保存10个文件,如“List_01”,“List_XX” - 然后在执行加载全部时从块中读取。

保存或加载时列表的最终排序并不重要 - 只需将对象作为单个列表提供即可。

+0

瓶颈实际上是CPU还是IO?因为将IO分布到多个文件中可能不会加快速度...... –

+0

一个有用的评论,在我想到的我不确定的示例中 - 但是出于参数的原因,我们假设它是CPU - 也就是说,一些合理数量的处理将序列化格式转换回大块对象。 – Coruscate5

+0

您可能需要查看任务并行库(Parallel.ForEach等)以及TPL数据流。 –

回答

0

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

为了节省,我可以让分区程序序列化&列表中的文件作为完成任务的非重复格式的任务。

对于装载,我可以在磁盘上的指定位置的现有区块的计数/列表,然后有TPL加载&反序列化所有块&重组他们在他们完成(使用一些互锁任何顺序var来确保每个文件只被读取一次)。

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