2016-09-21 4 views
0

Предположим, у меня есть список объектов одного класса, упакованных в один файл, который я сохраняю в/load при запуске приложения.Использование Async для загрузки/сохранения списка объектов в файлах

Что я хотел бы сделать, так это использовать синтаксис асинхронной обработки для ускорения загрузки всего времени & save-all time - давайте также предположим, что сами файлы эффективно упакованы (с использованием протокольных буферов или тому подобного).

Что было бы лучшим способом сделать это? Асинхронная обработка действительно поможет в этом сценарии?

Один из методов, который, как я думал, заключается в «предварительном определении» количества фрагментов путем выбора числа больше 1, деления списка на это число, а затем сохранения/загрузки с использованием этого числа в виде количества задач. Однако это кажется несколько произвольным, & Мне было любопытно, есть ли там библиотеки, которые могут просто принять решение для меня на основе некоторых условий.

I.e. Я мог бы назвать свою «chunkable список» что-то вроде:

Chunkable<List<SomeObject>> 

.. и тогда программа будет просто разделить список правильно читать/сохранить эффективным способом - например, сохраните 10 файлов, таких как «List_01», «List_XX», а затем прочитайте из кусков при выполнении нагрузки.

Окончательный заказ списка при сохранении или загрузке не имеет значения - просто наличие объектов в виде единого списка.

+0

Является ли узким местом на самом деле CPU, или IO? Поскольку распространение IO на несколько файлов вряд ли ускорит его ... –

+0

Полезный комментарий, и в примере, о котором я думаю, я не уверен - но, ради аргумента, скажем, это CPU - т.е. есть некоторый разумный объем обработки для перевода формата сериализации обратно в кусок объектов. – Coruscate5

+0

Возможно, вы захотите посмотреть параллельную библиотеку задач (Parallel.ForEach и т. Д.), А также поток данных TPL. –

ответ

0

Для потомства один концептуальный ответ заключается в использовании Partitioner в параллельной библиотеке задач.

Для сохранения, я могу иметь Разметку сериализации части списка & выписывать файлы в виде задач полных в данном неповторяющемся формате.

Для загрузки, я могу получить счета/список существующих кусков в заданном месте на диске, то есть TPL загрузить & десериализации все куски & сливают в любом порядке, они в комплекте (с помощью ВЗАИМОСВЯЗАННОГО var, чтобы каждый файл читался только один раз).

Вставьте код здесь, как только я проверил некоторые.

Смежные вопросы