Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有没有办法在内存中维护一个200MB的不可变数据结构并通过脚本访问它?_Php_Data Structures_Large Data Volumes - Fatal编程技术网

Php 有没有办法在内存中维护一个200MB的不可变数据结构并通过脚本访问它?

Php 有没有办法在内存中维护一个200MB的不可变数据结构并通过脚本访问它?,php,data-structures,large-data-volumes,Php,Data Structures,Large Data Volumes,我有一个900万IP的列表,通过一组哈希表,我可以创建一个常量时间函数,如果某个IP在该列表中,该函数将返回。我可以用PHP做吗?如果是这样,怎么做?我认为将其放入memcache可能是您最好/最快的方法。这对我来说似乎是布卢姆过滤器的理想应用。请查看提供的链接,这些链接可能会帮助您尽快完成 如果将文件读入sqlite是一种选择,那么您可以从索引中获益,从而加快查找速度 否则,memcached是一个选项,但我不知道如果使用纯php查找(我猜相当慢)检查存在性会如何进行。关于这个问题,有趣的

我有一个900万IP的列表,通过一组哈希表,我可以创建一个常量时间函数,如果某个IP在该列表中,该函数将返回。我可以用PHP做吗?如果是这样,怎么做?

我认为将其放入memcache可能是您最好/最快的方法。

这对我来说似乎是布卢姆过滤器的理想应用。请查看提供的链接,这些链接可能会帮助您尽快完成


  • 如果将文件读入sqlite是一种选择,那么您可以从索引中获益,从而加快查找速度


    否则,memcached是一个选项,但我不知道如果使用纯php查找(我猜相当慢)检查存在性会如何进行。

    关于这个问题,有趣的是你可以走多少条路

    我不确定缓存是否是您的最佳选择,仅仅是因为它有大量的数据和相对较少的查询。这里有一些想法

    1) 。链接mysql数据库表以使用ramdisk分区。我从未尝试过这个,但尝试一下会很有趣

    2) Linux通常有一个非常快速的文件系统。构建一个结构化文件系统,将记录分解为文件,只需调用file\u get\u contents()或file\u exists()。当然,这个解决方案需要您构建和维护文件系统,这也很有趣。rsync可能有助于使您的实时文件系统保持最新

    例如:

    /002/209/001/299.txt
    
    <?
    $file = $this->build_file_from_ip($_GET['ip']);
    if(file_exists($file)) {
        // Execute your code.
    }
    ?>
    
    /002/209/001/299.txt
    
    您是否尝试过像这样的NoSql解决方案?整个数据集在内存中进行管理


    这里有一些。

    您也可以选择多服务器路线。根据IP,使用不同的数据库连接(或API调用)。将数据拆分到多个服务器将减少对每个服务器的压力,从而提高访问速度。看起来还可以将表本身存储到内存中。看看“内存”或堆表类型。你可以试试这个,而不是使用“MyISAM”。有趣的是,你的两个解决方案都可以链接:)我的HD目前有600万个索引节点,所以唯一的方法是创建另一个具有更多索引节点的文件系统,我想这可以使用RAMDISK来完成!但是,我想首先检查一下元数据占用了多少空间,因为2000万个100字节的文件已经占用了2GB的RAM