Php 如何将大型数据集随机分成两个大小相等的数据集

Php 如何将大型数据集随机分成两个大小相等的数据集,php,arrays,csv,Php,Arrays,Csv,我有几个CSV文件,其中包含1000多万个值,每个值有9个字符长。我的目标是将每个文件分成两个大小相等的文件,其中每一半是从初始集随机选择的值 我正在考虑使用PHP来实现这一点,因为我对它略知一二 我可以想出两种可能的方法来做到这一点,但好奇的是哪一种会跑得更快?2是否有其他更好的方法?3或者数据集在1000万到1500万之间,这不重要吗 计划1: 将CSV转换为数组 使用Shuffle函数洗牌数组 使用array_chunk函数将数组分成2 将每个数组保存到CSV文件不确定如何保存,但会找到它

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

我正在考虑使用PHP来实现这一点,因为我对它略知一二

我可以想出两种可能的方法来做到这一点,但好奇的是哪一种会跑得更快?2是否有其他更好的方法?3或者数据集在1000万到1500万之间,这不重要吗

计划1:

将CSV转换为数组 使用Shuffle函数洗牌数组 使用array_chunk函数将数组分成2 将每个数组保存到CSV文件不确定如何保存,但会找到它 计划2:

将CSV转换为数组 使用array_rand随机选择X个值,其中X=值的数量/2,并根据该选择创建数组 对值的后半部分重复步骤2 将每个新阵列保存到CSV文件 这是靠近右边的地方吗?我应该考虑不同的语言吗?< /P> 谢谢大家!

计划3:

我编写了一个PHP脚本,获取所有CSV数据,并将其插入MySQL数据库,有很多例子

2在PHP中,从表中选择*,其中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;
    }
}

?>

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

如果文件太大,请忘记使用内存要求太高的数组。。。。创建一个临时数据库表,将数据加载到其中,并在写回文件之前通过数据库处理所有随机数据您的服务器是否有内存在一个数组中存储9000万个字符?最快/最简单的方法是通过Linux shell命令wc-l file获取行数并拆分-l X文件,其中X是wc命令提供给您的一半。很多分裂的例子,像这一个@DuaneLortie-这解决了问题的随机部分吗?问题是矛盾的。。将大型数据集分隔为两个大小相等的数据集。。两个大小相等的数据集并不是一个随机的拆分,但作为一个答案,它是相当弱的。如果您能提供更多的完整性,我们将不胜感激……是的,添加更多的依赖项和技术很可能会带来更好的解决方案,而且速度也会非常快。特别是对于看起来像一次性操作的东西。
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 '';
}