【问题标题】:PHP's natural sort memory issue on huge amount of data大量数据的PHP自然排序内存问题
【发布时间】:2013-01-26 17:07:12
【问题描述】:

我正在使用 php 的自然排序算法natsort,但我有一个关于内存使用的考虑。

事情就是这样。脚本从 mysql 中提取数据并将结果放入一个数组中,然后在其上应用 natsort。但这就是问题所在。行的文本可能很长,可能有数百行。

示例代码:

$array = array();
while ($row = $db->getResults()) {
  $array[$row->code] = $row->text;
}

if (empty($array)) {
  uksort($array, "strnatcmp");
}

我想知道这对记忆有何影响?这是合适的方法还是我应该做一些更有效、更愉快的事情?

【问题讨论】:

  • @Jack MySQL 可以有效地进行自然排序吗?
  • 没错。我正在避免使用 mysql natsort 因为它本身不支持。所以我更喜欢php的natsort。
  • @JoachimIsaksson 好吧,那么 那 应该是问题,不是吗? :)
  • @Jack,MySQL 没有很好的自然排序解决方案。看看this thread
  • 或者你只是创建一个额外的列,以便mysql 可以可靠地排序。

标签: php mysql sorting memory natural-sort


【解决方案1】:

您可以做的一件事是存储一个与您要排序的列重复的新列,但将其存储为使用常规排序算法时自然排序的转换格式。

从概念上讲,您可以通过将零填充数字序列的长度与字符串中可能出现的最长数字序列一样长来做到这一点。

我的解决方案并不完全坚固,但如果您的字符串只有已知最大长度的数字序列,那么您可以将它们用零填充到已知的最大长度。例如,如果您的 cd 曲目标题中嵌入了曲目编号,例如:

1 Foo
2 Bar
...
10 Baz

也许您决定可能的最长数字序列是 3(999 个可能的曲目),所以您可以像这样填充数字序列

001 Foo
002 Bar
...
010 Baz

这适用于具有多个数字序列的字符串。

示例 php 代码,尽管您可以编写一个 mysql 存储函数来执行此操作,然后在表上使用插入和更新触发器,以便对其进行透明维护。

$input = 'a44b1c399d4';
$nat = preg_replace_callback('#\d+#', function($m) {
    return str_pad($m[0], 3, '0', STR_PAD_LEFT);
}, $input);
echo $nat; // a044b001c399d004

然后在mysql中通过排序

order by natsort_column

这还可以让您在该列上放置一个索引,从而为您提供良好的排序性能。

【讨论】:

  • 如果我是正确的,我应该从 mysql 获取结果,在输出中添加另一列并再次使用该字段查询 sql?你能举一个mysql程序的例子来在第一次查询中应用这个代码吗?
  • @rambo.coder: 你也有上述mysql代码的例子吗?
  • 不,但是您可以使用存储函数将其编写得足够简单。只需在其中使用一个循环,使用 mysql 字符串函数,如 locate() concat() substr()
  • @rambo.coder:谢谢,但我刚刚找到了解决方案:stackoverflow.com/a/12257917/384864
  • @rambo.coder:哦,如果您没有结构化列,您的解决方案就会中断。
【解决方案2】:

您需要使用 MySQL WHERE、GROUP BY 和 ORDER BY 子句,这样您就不会浪费时间在 PHP 级别解析数千条不需要的记录。

【讨论】:

  • 我知道,但是如何在 mysql 中应用 natsort?
  • 重要的是将结果限制为您需要的记录。只要您的记录有限,您就可以在 PHP 中对它们进行排序,可能不如 MySQL 存储过程快,但足够快,因为您不应该获取很多行。如果您正在像您说的那样获取数百个,那么 1) 您的应用程序的设计存在问题,2) 这是一个管理报告页面,它不经常运行,所以没什么大不了的, 3) 您需要将结果限制在您需要的列中,或者 4) 需要在结果排序后实现缓存。
  • @Xeoncross 在一般情况下限制结果并稍后进行排序并非易事,因为例如要获得正确的 50 条记录,您需要进行排序才能知道它们是哪些。可能有特定于应用程序的方法,在这种情况下,我完全同意应该在数据库中进行限制。
  • @Xeoncross 我完全同意你的看法。但是我怎么知道在 PHP 中应用排序的限制在哪里?
猜你喜欢
  • 2016-07-31
  • 2013-01-13
  • 2013-12-13
  • 2015-10-30
  • 1970-01-01
  • 2021-12-07
  • 2019-12-12
  • 2015-12-27
相关资源
最近更新 更多