быстрый способ сгенерировать массивную матрицу случайных данных

Привет, я хочу создать матрицу случайных данных, скажем, row*col = 30000*500000. Я пытался использовать VBA в Excel, но очень медленно; 64-битный R завис, даже если я использовал пакет bigmemory на своем блоке памяти 8G. Чтобы сделать это как можно быстрее, должен ли я использовать C? Полезно ли в этом вопросе параллельное программирование на Java 8? Кто-нибудь имел опыт с этим? Очень признателен!


person Kevin    schedule 05.03.2015    source источник


Ответы (1)


Если каждое из ваших случайных чисел занимает четыре байта, вам нужно в общей сложности 60000000000 байтов, то есть 60e9 байтов или 55 ГиБ. Неудивительно, что вы не можете удержать их все сразу в памяти на компьютере с 8 ГиБ.

Если вам действительно нужно так много случайных чисел (для чего?), ваш единственный шанс - записать их в большой файл, а затем использовать их через доступ к файлам. Кроме того, просто генерируйте их на лету, когда это необходимо; что лучше, зависит от вашего конкретного приложения.

Если вам также нужно хорошее качество, я бы предложил использовать компилятор/библиотеку с хорошим встроенным генератором случайных чисел.

Вот короткий пример программы на Фортране, показывающий, как может выглядеть программа для записи такого файла. Не стесняйтесь адаптироваться к языку по вашему выбору.

program random
  implicit none
  integer, parameter :: nx = 30000, ny=500000
  real, dimension(ny) :: r  ! A real array of length ny, i.e. 500000
  integer :: i

  open(20,file="random.dat",form="unformatted",access="stream")  ! Byte stream access
  do i=1,nx  ! Do this nx times
     call random_number(r)  ! Fill up the array with pseudorandom numbers
     write (20) r  ! Write it to the file
  end do
  close(20)
end program random
person Community    schedule 05.03.2015
comment
Спасибо, это определенно имеет смысл для меня. - person Kevin; 06.03.2015