我正在开发用于处理大量数据的数据分析算法。
因此,我的目标是发展我的数学已经在这样的方式,是有可能在以后分发算法在许多机器(大数据)。
我能够开发我的算法,以这样的方式,它计算一些中间元数据和预先计算的值,它保存-元数据的实际原始数据。这可能会使存储的数据量增加相当多(实际上增加数百%),但这也会大大减少处理时间(如果不是数千%,也会减少数百个)。
这就引出了一个问题:构建智能算法和实现来交换RAM以获得处理能力是否是一个好主意。
这反过来又打开了一个问题:什么是更昂贵的RAM或处理能力?
当然,如果不执行所有措施并进行适当的比较计算,就不可能准确地回答这一问题。
但是,开发时间(我的时间)也是有价值的;-),所以我想在开发过程中做出好的决定。我的脑子里已经有了不同的算法,但它们还没有实现--这需要几个月(希望不是几年)--在我从事学术研究的时候,这一点也不奇怪。
我可以有根据地猜测我需要多少内存(时间是xyz),以及花费的时间会有多少(就像大O符号中的那样)。
在所有这些介绍之后:是否有一个经验规则,当它是值得它花费RAM的计算速度?
的详细信息
首先,我正在开发算法。实施只是从这一点开始的,而不是我目前主要关注的问题。在设计我的算法(数学)时,我已经试着让那个必须在一天之外订购服务器的人记住了。(我不是很好吗?;-)这意味着,我不知道所有的实现细节,但我试着猜测一下我认为可能是什么情况:
的详细信息
首先:“算法”并不意味着软件的实现(我有这种感觉,有些人可能会弄错)。算法是为了得到我的数学模型而要采取的步骤的数学描述。
这是一个交易:
第三条机制的实施是我们正在采取的行动。它不完全是元数据,但这种机制需要消耗内存。所以,我想,这里的大多数人都不会想到“缓存”。它甚至不是真正预先计算出来的值,而是存储在彩虹表或类似的东西中。占用内存的是机制本身的元数据,因为机制具有状态。
我希望现在的情况更清楚。
大O表示法的
对于上述算法(1至3.),n为输入数据量:
发布于 2016-12-09 16:25:54
什么更贵,内存还是处理能力?
这是一个错误的二分法,有很多原因。
如果您的目标用户是普通用户,那么您的约束可能就是他已经安装在机器上的内存;您不会要求他购买更多的内存来运行您的应用程序,对吗?
如果你是你自己的听众,并且你在考虑购买一台新机器(通常需要获得更多处理器马力)而不是购买更多内存,答案应该是显而易见的:更多的RAM几乎总是更便宜。
如果您试图通过编写软件的方式来解决这个问题,最好的操作方法是以尽可能简单和合理的方式编写一个原型,然后通过测量和分析来决定优化的位置。这将使您最大限度地利用开发资源,因为它将集中于它所属的问题:在您的系统中,性能考虑因素非常重要的那一小部分代码。
如果您需要更好的灵活性,请考虑虚拟机/云计算。您可以根据需要(在处理器核心+内存基础上)配置这些配置,并混合和匹配配置,直到找到您喜欢的最佳位置。
发布于 2016-12-09 16:53:32
简短的回答:这是你的工作,以最专业和最有效率的方式解决它。
你可以咨询其他研究人员、计算机科学家和软件开发从业者,但是没有人对你想要的系统有那么深的了解。
最好的情况是,你所做的每一个受过教育的猜测都将在大致的范围内。最糟糕的情况是,你所有的猜测都是错误的,你的一些早期选择最终都是错误的,浪费了你宝贵的时间、精力和资金。
我建议把重点放在做研究的艺术上:
您将需要假设高密度、低延迟的持久性内存(如三维XPoint )将产生结果。您需要在您的研究中找到利用这一点的方法,尽管您无法访问实际的硬件。因此,在您的研究中,您需要“模拟”这种硬件的特性。
由于这样的模拟需要不一定正确的假设,所以您可能需要做出多组假设(场景),并说明您的研究在每个场景中的影响。(有点像全球变暖的研究。)
除了无处不在的持久内存之外,您还可能不得不担心GPU、高通Centriq、Movidius Myriad、FPGA (现在在AWS上)、自定义ASIC、张量处理单元、光互连、到达(2016)、另一个技术泡沫破灭等。
发布于 2016-12-09 17:02:48
如果我们假设您有无限数量的RAM可用,那么对于“何时值得将RAM用于计算速度”这个问题有一个简单的答案:当从内存分配、管理和检索数据所需的时间少于每次需要时(重新)计算它所需的时间时。
在这方面,有若干因素需要考虑:
在我的经验中,唯一的经验法则是缓存结果在深度递归算法中非常有效,在这种算法中,‘底部’值再次被拉进来,以构建“更高”的结果。如果您能够预测哪些值是最常用的,那么您就可以通过缓存这些值来获得最大的收益。缓存所有东西,以备以后再次需要时使用,可能会损害性能。
最终,我将从没有缓存开始,然后尝试添加它们。我常用的成语是这样的模式:
def calculateFoo(bar):
if bar in cache:
return cache[bar]
foo = complicatedCostlyCalculation()
cache[bar] = foo
return foo很容易将其添加到后面,或者将其注释掉以查看缓存的影响。
https://softwareengineering.stackexchange.com/questions/337851
复制相似问题