Предположим, что числа с плавающей точкой в вашем файле записаны в таком формате, что у вас есть 15
цифр после числа с плавающей запятой. Таким образом, у нас есть 17
символов для каждого числа. Затем, давайте также предположим, что они разделены символом
, и что у нас есть \n
в конце каждой строки, так что у нас будет всего 436*18=7848
символов, что предполагает, что символы ascii будут использовать один байт каждый. Затем ваш файл использует около 25G
памяти, так что вы можете сказать, что у вас есть (25*2^30)/7848=3.6041e+06
строк (при использовании 2 ^ 30 байт в гигабайте, масштаб примерно такой же, если вы предпочитаете определение как 10 ^ 9 байт) `.
Таким образом, матрица размером 4e6, 436
(я предполагаю, что верхняя граница размера вашей матрицы будет намного больше), если предположить, что каждое число с плавающей запятой занимает 4
байт, примерно займет 6.48G
. В этом нет ничего сумасшедшего, и вы можете найти этот объем непрерывной памяти, выделяемый при чтении матрицы с помощью функции load
, если у вас достаточно памяти на вашей машине. В данный момент у меня есть 8G
, а rand(4*1e6,436)
выделяет желаемый объем памяти, хотя в итоге он использует пространство подкачки и замедляется. Я предполагаю, что load
сам по себе будет иметь некоторое количество служебной информации, но если у вас есть 16G
ОЗУ (что не является сумасшедшим в наши дни), вы можете спокойно перейти с load
.
Теперь, если вы думаете, что не найдете столько смежной памяти, я предлагаю вам просто разделить ваш файл на куски, такие как 10
матрицы, и загрузить и транспонировать их отдельно. То, как вы это сделаете, зависит от вас и от приложения, а также от того, есть ли в данных какие-либо шаблоны разреженности или нет. Кроме того, убедитесь (если вам не нужна дополнительная точность), что вы используете точность с плавающей запятой.