我正在开发一个python项目,我需要使用一个大小在10000X10000X10000左右的矩阵。
考虑到:
我的要求是否切合实际?在合适的时间里,我需要以这种方式工作的硬件要求是什么?
如果可以提高性能,我也愿意切换语言(例如,在C中执行线性代数运算)。
答案 0 :(得分:4)
那么,第一个问题是,您将在矩阵中存储哪种类型的值? 假设它是整数(并且假设每个字节使用ISO规范的大小,4个字节),你将有4 * 10 ^ 12个字节来存储。这是一个大量的信息(4 TB),所以,首先,我不知道你从哪里获取所有这些信息,我建议你只加载它的一部分,你可以轻松管理。
另一方面,正如你可以对它进行并列化,如果你买得起NVIDIA卡,我会建议你使用CUDA,这样你的性能会更好。
总之,很难只将所有信息都存储在RAM中,并使用paralell语言。
PD:你错误地使用了关于算法时间复杂度的O()方法。你应该说你有一个O(n),即n = size_of_the_matrix或O(n m t),n,m和t是矩阵的维数。
答案 1 :(得分:1)
实际上,记忆在这里是个大问题。取决于矩阵元素的类型。例如,每个浮点数占用24个字节,因为它是一个盒装对象。由于你的矩阵是10 ^ 12,你可以做数学运算。 切换到C可能会使内存效率更高,但速度更快,因为numpy本质上是用C语言编写的,并且有很多优化
答案 2 :(得分:1)
像dask之类的东西可能适合你吗?还有其他方法可以使用numpy来实现这一点,例如使用内存映射的arrarys并以可并行化的块进行操作,但是如果你仍然熟悉Python,那将会更加困难。
就我个人而言,我没有看到使用不同语言完成此任务的好处。您仍然需要处理并行操作的硬件限制和分块。使用dask,这几乎是开箱即用的。