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