【问题标题】:How to randomly separte large data set into two equally sized data sets如何将大数据集随机分成两个大小相等的数据集
【发布时间】:2017-02-01 19:49:50
【问题描述】:

我有几个 CSV 文件,其中包含超过 1000 万个值,每个值长 9 个字符。我的目标是将每个文件分成两个大小相等的文件,其中每一半是从初始集中随机选择的值。

我正在考虑使用 PHP 来做这件事(因为我对它有点熟悉)。

我可以想到两种可能的方法来做到这一点,但好奇 (1) 哪一种会跑得更快? (2) 有没有更好的方法? (3) 还是用10到1500万左右的数据集没关系?

计划一:

  1. 将 CSV 转换为数组
  2. 使用 shuffle() 函数对数组进行随机播放
  3. 使用 array_chunk() 函数将数组一分为二
  4. 将每个数组保存到 CSV 文件(不知道如何解决,但会弄清楚)

计划 2:

  1. 将 CSV 转换为数组
  2. 使用 array_rand() 随机选择 X 个值,其中 X =(值数 / 2),并根据该选择创建数组
  3. 对后半部分的值重复第 2 步
  4. 将每个新数组保存到 CSV 文件

这是靠近正确的地方吗?我应该考虑使用其他语言吗?

谢谢!

【问题讨论】:

  • 如果文件那么大,忘记使用数组(内存要求太高)......创建一个临时数据库表,将数据加载到其中并在回写之前通过数据库处理所有随机化归档
  • 您的服务器是否有内存可以在数组中存储 9000 万个字符?
  • 最快/最简单的方法是通过 Linux shell 命令wc -l file 获取#of 行和split -l X file,其中 X 是 wc 命令给你的一半。很多“拆分”的例子,比如这个……howtogeek.com/howto/ubuntu/…
  • @DuaneLortie - 这能解决问题的“随机化”部分吗?
  • 这个问题是矛盾的..“将大数据集分成两个大小相同的数据集”..两个大小相同的数据集不是随机拆分

标签: php arrays csv


【解决方案1】:

计划 3:

1) 编写一个 PHP 脚本,获取所有 CSV 数据并将其插入 MySQL 数据库(大量示例)。

2) 在您的 PHP select * from table where type = 1 order by rand() limit 10 或其他带有时间戳的花哨查询中

这就是我的做法。

用例子编辑

<?php

$files = glob("path/to/files/*.csv");

foreach($files as $file) {

    if (($handle = fopen($file, "r")) !== FALSE) {
        echo "<b>Filename: " . basename($file) . "</b><br><br>";
        while (($data = fgetcsv($handle, 4096, ",")) !== FALSE) {
            //do something with the data
            echo implode("\t", $data);
        }
        echo "<br>";
        fclose($handle);
    } else {
        echo "Could not open file: " . $file;
    }
}

?>

这将获取目录中所有 csv 文件的内容。请记住,对于具有如此多值的服务器来说,这是一项压力很大的任务。所以也许这会有所帮助:

function listdirfile_by_date($path)
{
$dir = opendir($path);
$list = array();
while($file = readdir($dir))
{
    if($file != '..' && $file != '.')
    {
        $mtime = filemtime($path . $file) . ',' . $file;
        $list[$mtime] = $file;
    }
}
closedir($dir);
krsort($list);

foreach($list as $key => $value)
{
    return $list[$key];
}
return '';
}

一个被盗的函数,它列出了按日期排序的文件。有了这些数据,您只能使用最新文件运行脚本。

【讨论】:

  • 我会投赞成票,但它作为一个答案相当薄弱。希望更完整...
  • 是的,添加更多的依赖项和技术很可能会产生更好的解决方案,而且速度也会快如闪电。特别是对于看起来像一次性操作的东西。
猜你喜欢
  • 2011-07-28
  • 2019-08-17
  • 1970-01-01
  • 2020-05-07
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2013-06-29
相关资源
最近更新 更多