1

我在 mysql 中有一个 150 行的数据集。我有一组 2 个 for 循环,它们根据一些用户输入和数据集运行数学计算。该代码对 30 个行窗口进行计算,并将每个 30 行窗口的结果累加到一个数组中。我的意思是,我对第 0-29 行、然后是 1-30、然后是 2-31 等进行“循环”计算......这将导致 120 个“循环”。

现在 for 循环是这样设置的(有更多字段,为了简单起见,我只是修剪了代码。

    $period=30;
    $query = "SELECT * FROM table"; 
    $result = mysql_query($query); 
    while ($row = mysql_fetch_assoc($result)){ 
        $data[] = array("Date" => $row['Date'], "ID" => $row['ID']); 
    }
    for($i=0;$i<(count($data)-$window);$i++){
        for($j=0;$j<$window;$j++){
            //do calculations here with $data[]
            $results[$i][$j]= calculations;
        }
    }

这适用于我拥有的行数。但是,我将脚本打开到具有不同窗口(360 行)的更大数据集(1700 行)。这意味着迭代次数呈指数增长。它给了我一个内存不足的错误。快速使用 memory_get_peak_usage() 表明内存会不断增加。

我开始认为让循环搜索该数据数组非常费力,尤其是当“窗口”与许多“循环”重叠时。示例:循环 0 遍历第 0-29 行。循环 1 遍历第 1-30 行。因此,这两个周期都共享他们需要的一行数据,但我告诉 PHP 每次都查找新数据。

有没有办法更好地构建这个?关于运行这些并发周期,我有点迷失了。

4

2 回答 2

1

我认为正在消耗内存的数组将是$result数组。在您的小样本中,它将是一个包含 150x149 个单元的二维数组。array( 150, 149 ). 每个元素 144 字节,即 3,218,400 字节,略高于 3 Meg + 剩余存储桶空间。

在您的第二个较大样本中,它将是array(1700,1699). 每个元素 144 字节,即 415,915,200 字节,略高于 406Meg + 剩余存储桶空间,仅用于保存计算结果。

我认为您需要询问您是否真的需要保存所有这些数据。如果你真的这样做了,你可能不得不想出另一种存储它的方法。

我认为尝试 1000 次奇数的数据库调用没有任何意义,因为这只会增加开销,因为您仍然必须在数组中维护结果列表。

于 2013-07-30T19:23:06.723 回答
0

SQL方式

您可以通过使用来完成此操作LIMIT

$period = 30;
$cycle = 0; //
$query = "SELECT * FROM table LIMIT $cycle,$period";

这将仅返回每个周期所需的结果。您将需要循环和递增$cycle. 但是,您现在执行此操作的方式可能会更好。

但是,这不会循环返回并获取第一个数据,您将不得不添加额外的逻辑来处理这种情况。

于 2013-07-30T17:54:35.940 回答