更糟糕的罪恶:副作用还是传递大量物体?

5 memory r function side-effects global-variables

我在函数内部的循环中有一个函数.内部函数在内存中获取并存储大量数据(作为全局变量......我使用"R",类似于"S-Plus").循环遍历要获取的长数据列表.外部函数启动该过程并传入要获取的数据集列表.

for (dataset in list_of_datasets) {
  for (datachunk in dataset) {
    <process datachunk>
    <store result? as vector? where?>
  }
}
Run Code Online (Sandbox Code Playgroud)

我编写了内部函数来存储每个数据集,然后移动到下一个数据集,因此外部函数的所有工作都作为全局变量的副作用发生...一个大禁忌.这比收集和返回一个巨大的,占用记忆的向量矢量更好还是更糟?是否有优越的第三种方法?

如果我将数据向量存储在数据库而不是内存中,答案会改变吗?理想情况下,我希望能够终止该功能(或由于网络超时而使其失败),而不会丢失在终止之前处理的所有信息.

All*_*len 9

在外部函数中使用变量而不是全局变量.这将为您提供两种方法中的最佳方法:您不会改变全局状态,也不会复制大量数据.如果您必须提前退出,只需返回部分结果.

(参见R手册中的"范围"部分:http://cran.r-project.org/doc/manuals/R-intro.html#Scope)


小智 6

记住你的Knuth."过早的优化是所有编程邪恶的根源."

试试副作用免费版.看它是否符合您的性能目标.如果确实如此,那么首先你没有问题; 如果没有,那么使用副作用,并为下一个程序员注意你的手被迫.


Jef*_*rey -1

在不知道所使用的语言/编译器的情况下很难明确地说。但是,如果您可以简单地将指针/引用传递给您正在创建的对象,那么对象本身的大小与函数调用的速度无关。以后处理这些数据可能会是一个不同的故事。