Подскажи самый быстрый способ преобразования IEnumerable в массив.
На входе подается массив длинной несколько сотен миллионов значений. Нужно очищать этот массив от мусора в зависимости от текущей итерации. И есть библиотека, которая знает только о массивах.
Самое быстрое, что я смог придумать выглядит вот так.
ushort[] curBuffer = new ushort[size];//size - размер массиваfor (int k = 0; k < size; k++)
curBuffer[k] = (ushort)(_buffer[k] == (iterationNumber + 1) ? 1 : 0);//_buffer - входной массив
Это оказалось на пару секунд быстрей, чем метод ToArray().
Может, еще быстрее как-то можно?
Для тех у кого возникнут вопросы, что на входе и выходе:
Вход: 1 1 1 00 0 2 2 2 ... N N N
На выходе на первой итерации: 1 1 1 00 0 0 0 0 ... 0 0 0
На выходе на второй итерации: 0 0 0 00 0 2 2 2 ... 0 0 0 и тд
Re: Быстро IEnumerable в массив
От:
Аноним
Дата:
12.05.13 15:44
Оценка:
Здравствуйте, Glas, Вы писали:
G>Подскажи самый быстрый способ преобразования IEnumerable в массив.
G>На входе подается массив длинной несколько сотен миллионов значений. Нужно очищать этот массив от мусора в зависимости от текущей итерации. И есть библиотека, которая знает только о массивах. G>Самое быстрое, что я смог придумать выглядит вот так. G>
G>ushort[] curBuffer = new ushort[size];//size - размер массива
G>for (int k = 0; k < size; k++)
G> curBuffer[k] = (ushort)(_buffer[k] == (iterationNumber + 1) ? 1 : 0);//_buffer - входной массив
G>
G>Это оказалось на пару секунд быстрей, чем метод ToArray(). G>Может, еще быстрее как-то можно?
G>Для тех у кого возникнут вопросы, что на входе и выходе: G>Вход: 1 1 1 00 0 2 2 2 ... N N N G>На выходе на первой итерации: 1 1 1 00 0 0 0 0 ... 0 0 0 G>На выходе на второй итерации: 0 0 0 00 0 2 2 2 ... 0 0 0 и тдъ
Здравствуйте, Glas, Вы писали:
G>На входе подается массив длинной несколько сотен миллионов значений. Нужно очищать этот массив от мусора в зависимости от текущей итерации. И есть библиотека, которая знает только о массивах. G>Самое быстрое, что я смог придумать выглядит вот так. G>... G>Это оказалось на пару секунд быстрей, чем метод ToArray(). G>Может, еще быстрее как-то можно?
Имхо, хороший кандидат на распаралеливание. Несколько сотен миллионов элементов — это довольно-таки значительные цифры.
Здравствуйте, Lloyd, Вы писали:
L>Имхо, хороший кандидат на распаралеливание. Несколько сотен миллионов элементов — это довольно-таки значительные цифры.
Запихал итерации в потоки по количеству ядер, но боюсь как бы не словить OutOfMemory. Из 6с на всю итерацию, 4 тратится на копию буфера
Здравствуйте, Glas, Вы писали:
L>>Имхо, хороший кандидат на распаралеливание. Несколько сотен миллионов элементов — это довольно-таки значительные цифры.
G>Запихал итерации в потоки по количеству ядер, но боюсь как бы не словить OutOfMemory.
Не понятно, что вы имеете в виду. Можно привести пример кода?
Re[5]: Быстро IEnumerable в массив
От:
Аноним
Дата:
12.05.13 22:11
Оценка:
Здравствуйте, Glas, Вы писали:
G>Здравствуйте, Аноним, Вы писали:
А>>C устройства камеры или с файловой системы, по сети загружается ? Сколько времени занимает прием входных данных ?
G>Зачем это все? Я четко обозначил узкое место. Входной массив я изменить не могу.
Тем что 100 Мб мгновенно не появляются из неоткуда, можно обрабатывать данные по мере их считывания.
Здравствуйте, Glas, Вы писали:
G>size и Length одинаковы, или тут у меня какой-то пробел в знании?
Подробность реализации JIT-оптимизатора CLR (она ещё и зависит от x86/x64). Проверьте.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.