问题大概是这样的。
想建立一个3000*3000的二维数组,用来存储一些数据。
因为要频繁读取这个数组,所以想存贮在内存中。有没有一些比较好的办法。就是定义了之后,所有的PHP文件都能用的。而且是存在内存中。

解决方案 »

  1.   

    听说用memcache可以,大家给点建议啊。
      

  2.   

    本帖最后由 xuzuning 于 2011-07-28 19:11:29 编辑
      

  3.   

    请参考前一段时间我发的问题贴:关于 PHP 中巨型数据对象的内存开销问题的研究基本结论可以说是:不行 :(
    换个解决思路吧。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  4.   

    我用了memcache扩展,已经配置好了。 Apache2.2 + PHP 5.2.17
    而且这个二维数组都是读操作。可能用memcache更合适一点吧。
      

  5.   


    我的想法是先写一个脚本,把数据从数据库读进  创建的一个memcache类中,然后其他的PHP脚本再读取操作这个类。我刚刚看了一下你的那个帖子,这样做好像不应该会产生:如果并发100个就产生100*Size(memcache) 这个问题吧。大家读的操作的都是一个memcache类啊。就相当于当成一个一直存在的全局变量了。 
      

  6.   

    你说的“memcache类”是指“从 memcache 中读取到的一个数据对象”吧?PHP 中所谓的“全局变量”,是局限在一个 HTTP Request 处理过程中的,没有“跨 request 的全局变量”这种东西。所以,100 个并发请求,就是 100 个进程,它们各自会占用一个 Size(memcache) 的内存块。用 memcache 之类的“网络缓存服务”的话,还要发生额外的网络传输,得不偿失(其实是无得有失)。还不如直接写成 PHP 然后每次处理 request 的时候包含进来呢。
      

  7.   

    我没有用过 memcache,也没有这方面的知识。原以为他是和“共享内存”差不多的玩意,刚才搜索了一下,原来根本不是一回事。两个 HTTP交互 之间根本就不可能通过 memcache 进行数据交换(共享内存是可以的),因为他们各自有自己的独立 memcache 空间
    况且 memcache 是通过网络协议与 php 相连的,这与数据库也是一样的
      

  8.   

    看你想怎么读取这些数据了。如果不是每次都需要完整的3000x3000数组中的全部内容,建议你还是别包含。建议保存到MySQL的MEMORY表中。读取时查询矩阵的坐标即可。或者用Memcache,但设计时不要把整个数组存进去,用数组维度的索引作为键名,以便每次只读取一个元素。当然,完全使用Memcache还有一个好处,你可以在存储时将整个矩阵、矩阵的每行、矩阵的每列都分别存储,这样在你需要完整数据、整行整列数据及单个数据时效率最高。
      

  9.   

    我原以为是多个HTTP请求可以共享一块内存。这样的话我只要开出来一个空间就行了。看来我想错了。但是,我不想每次HTTP请求都去读数据库,这样太慢了。所以才想把它读到内存中。
    但是,如果memcache不能共享的话,岂不是每次都要读一遍啊。如果我想把数据从数据库只读一遍,然后所有的HTTP请求都可以用该怎么做?
      

  10.   

    首先,你提到“最短路径”,我想你那个巨大的数据应该是用来描述地图连通数据的吧?如果只是为了搜索最短路径,也许可以考虑用更具有逻辑性的数据结构来表达连通图,这样就不至于是个巨型数据对象了。当然这是你的应用算法应该考虑的问题,这里就不多说了。如果要在多个 HTTP 处理过程中使用共享内存,PHP 语言本身是不行的,但可以通过某些系统扩展来实现,比如 shmop。这里只是提一个思路,真正实现起来还有不少细节需要考虑。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  11.   

    刚又搜了一下,我其实只是想把数据库的数据读到内存中,大家都读取这个数据。并不进行写操作。
    这样的话memcache应该可以做到吧。毕竟大家使用的都是同一个memcache 数据。  
      

  12.   

    建议将这个数组进行分拆,分拆后再分别进行保存或者是其他操作,不要想着一次性读入或者是一次性完成操作,都是不可取的。PHP没有全局变量的概念,除非你使用文件来进行保存,或者是存入数据库或Memcached。
      

  13.   

    搞明白了。
    Memcached 是个内存缓存的东西。不是“共享内存”。但是我主要的想法是想减少磁盘的I/O,而且想要把数据读到内存中进行一些运算。
    如果有100个人用Memcahce中同一个数据的话,确实会造成复制99遍,产生100*Size(memcache)的占用内存。但只能这样了。因为这样毕竟比读取数据库快吧。毕竟数据都缓存到内存中了。只能以空间换时间了。但是如果不用memcache的话,也只能用共享内存了。但是那个操作太复杂了,要直接操作内存地址。
      

  14.   

    主要是想减少磁盘的I/O,因为读取数据库太慢。特别数据量大。而且如果用户并发高的话,不是会更慢吗。
    所以才想用memcache。
      

  15.   

    你不是将整个数组塞进memcahce去吧?这样读取压力大,你能不能将每(几)个数组值hash化,这样应用才体现价值。
    memcache强在其分布式应用,如果你这个大数组分几台服务器存,那是相当舒畅。
    而且你如果单服务器的话建议用apc,负载相对要高不少。
      

  16.   

    看来你还是没有完全搞明白。memcached 是“基于网络服务的缓存引擎”,它的所谓“内存缓存”是指它是完全依赖内存实现的,而没有用到任何持久化。因为多了一个网络传输的过程(即使是在本机部署),用它还不如用 APC/XCache,这两个也是“内存缓存”,而且不需要网络传输。“单服务器部署时使用 memcached 是一种典型的误用”。其实即使是 APC/XCache,我看也不如直接把你那个巨型数组用 serialize() 弄成字符串,然后在程序调用的时候用 unserialize() 加载就行了,毕竟是个只读数据嘛。另外,你一直没说那个大数组里保存的数据元素是什么,如果只是简单的 int 之类的数据的话,用共享内存其实并不麻烦。即使你实在不想搞共享内存,不知道你是否注意到我在 #14 楼提到的,如果你的数组是一个“稀疏矩阵”的话,应该首先考虑从算法层面进行优化。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  17.   

    数据库的内存表的确是个好东西,不过在楼主这个具体的应用场景里,它不会比 memcached 更有用,除非他的“最短路径”算法里恰好有适合用 SQL 来实现的部分。
      

  18.   

    是session还是什么?如果是session,耗费太大了。
      

  19.   

    内存表,apc,memcache,等等都可以的,放进php数组中(只不过要加载一下)
      

  20.   

    问题的关键是你要把这么多的数据用做什么用途?我说一下我这边的状况
    我这边也涉及到了巨型数据,不过我的主要用途就是前台的显示和查询
    因为其在前台显示的时候格式不一定,所以我就把他们直接后台用array的格式输出为json,并保存为js
    当我要显示或查询的时候直接用前台jquery操作这个js档案,消耗的是客户端电脑的CPU
      

  21.   

    你这个还有一个瓶颈就是网络传输,算得上巨型数据的,都得上 M 了吧 :)
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)