我正在编写一个PHP函数,它需要遍历一个指针数组,并为每个项目拉入数据(无论是从MySQL数据库还是平面文件)。有没有人有任何想法来优化这一点,因为可能会有成千上万的迭代?
我的第一个想法是使用一个缓存数据的静态数组,任何修改都会改变这个缓存数组,最后我可以将它刷新到磁盘。然而,在超过1000个项目的循环中,如果我只在数组中保留大约30个项目,这将是无用的。每一项都不是太大,但是它们在内存中的1000+太多了,因此需要磁盘存储。
数据只是经过gzipped压缩的序列化对象。目前我使用数据库来存储数据,但我认为平面文件可能会更快(我不关心并发问题,也不需要解析它,只需解压缩和反序列化)。我已经有了一个自定义迭代器,它将一次拉入5个项目(以减少DB连接),并将它们存储在此缓存中。但同样,当我需要迭代数千次时,使用30的缓存是相当无用的。
基本上,我只需要一种快速迭代这些项目的方法。
发布于 2009-12-17 09:39:42
好吧,你没有给我太多的东西去继续。你没有描述你的数据,你没有描述你的数据在做什么,你什么时候需要一个对象而不是另一个对象,这些对象是如何被临时释放的,以及在什么情况下你需要它回来,以及...
所以任何人在这里说的任何话都完全是胡说八道。
...so沿着这些路线,这是一个在黑暗中的机会。
如果你只想在任何时候在内存中存放x个项目,那就为x个项目留出空间。然后,每次访问对象时,记下时间(这可能并不意味着时钟时间,而可能意味着您访问它们的顺序)。将每个项目保存在列表中(它可能不是在列表中实现的,而是作为类似堆的结构实现的),以便最近使用的项目更快地出现在列表中。当您需要将一个新的项目放入内存时,您可以替换之前使用时间最长的项目,然后将该项目移到列表的最前面。您可能需要保留这些项的另一个索引,以便在需要时确切地知道它们在列表中的位置。然后,您要做的就是查找项所在的位置,适当地链接其父指针和子指针,然后将其移动到列表的最前面。可能还有其他方法来优化查找时间。
这被称为LRU算法。这是一种用于虚拟内存的页面替换方案。它所做的是延迟瓶颈(磁盘I/O),直到它可能无法避免。值得注意的是,该算法不能保证最优替换,但它的性能仍然很好。
除此之外,我建议在很大程度上(如果可能)将你的代码并行化,这样当一个项目需要在硬盘上加载或转储时,你可以让处理器忙于真正的工作。
< edit >根据您的评论,您正在处理神经网络。在您最初馈送数据的情况下(在校正阶段之前),或者当您积极地使用它进行分类时,我不认为该算法是一个坏主意,除非没有可能的方法来适应内存中最常用的节点。
在修正阶段(也许是back-prop?),你必须在内存中保存哪些节点是显而易见的……因为你已经访问过他们了!
如果您的网络很大,您将无法在没有磁盘I/O的情况下幸免于难。诀窍是找到一种最小化它的方法。< /edit >
发布于 2009-12-17 09:26:03
显然,将它保存在内存中比其他任何东西都要快。每件物品有多大?即使每个1K,一万个也只有10M。
发布于 2009-12-17 09:26:29
在获得所需的数据后,您总是可以中断循环。这样它就不会继续循环了。如果您正在存储的是平面文件..您的服务器HDD将受到包含数千或数百万个不同文件大小的文件的影响。但是如果你谈论的是存储在数据库中的整个实际文件。然后,最好将其存储在一个文件夹中,并只将该文件的路径保存在数据库中。并尝试将提取的项放入XML中。因此,它更容易访问,并且它可以包含许多属性,例如拉取的项目的详细信息(名称、上传日期等)。
https://stackoverflow.com/questions/1918871
复制相似问题