PHP的速度/内存问题
可能重复:PHP的速度/内存问题,php,arrays,Php,Arrays,可能重复: 我在速度和内存使用方面有问题 我有一个脚本,需要能够运行得非常快。它所做的只是从1-100MB加载多个文件,包括一个值列表,并对照另一个列表检查其中有多少 我的首选方法是将文件中的值加载到数组中(explode),然后循环遍历该数组,并使用isset检查值是否存在 我的问题是有太多的值,它使用了超过10GB的内存(我不知道为什么它使用这么多)。因此,我一次将几个值从文件加载到内存中,而不是将整个文件分解。这会降低内存使用率,但速度非常慢 有更好的方法吗 代码示例: $check=a
我在速度和内存使用方面有问题 我有一个脚本,需要能够运行得非常快。它所做的只是从1-100MB加载多个文件,包括一个值列表,并对照另一个列表检查其中有多少 我的首选方法是将文件中的值加载到数组中(
explode
),然后循环遍历该数组,并使用isset
检查值是否存在
我的问题是有太多的值,它使用了超过10GB的内存(我不知道为什么它使用这么多)。因此,我一次将几个值从文件加载到内存中,而不是将整个文件分解。这会降低内存使用率,但速度非常慢
有更好的方法吗
代码示例:
$check=array('lots','of','values','here');
$check=array_flip($check);
$values=explode('|',file_get_contents('bigfile.txt'));
$matches=0;
foreach($values as $key)
if (isset($check[$key])) $matches++;
也许您可以编写自己的PHP的C扩展(参见示例),或者用C编写一个小型实用程序,让PHP运行它(也许使用) 也许您可以编写自己的PHP C扩展(参见示例),或者用C编写一个小的实用程序,让PHP运行它(也许使用) 打开文件并逐行阅读。可能使用MySQL进行导入(加载数据填充)、生成数据或同时使用两者。打开文件并逐行读取。可能使用MySQL进行导入(加载数据填充)、生成数据或两者兼而有之。看来您需要一些改进的搜索引擎
Sphinx搜索服务器可用于快速搜索您的值 看来你需要一些改进的搜索引擎
Sphinx搜索服务器可用于快速搜索您的值 对于某种形式的面向键/值的NoSQL数据存储(mongodb、couchdb、Riak)(甚至可能只是一个大型memcache实例),它们似乎是一个经典的解决方案 假设您可以在需要进行搜索之前将大型数据文件加载到数据存储中,并且您将不止一次地使用加载文件中的数据,那么您应该会看到一些令人印象深刻的收益(只要您的查询、mapreduce等不是很糟糕),根据数据的大小来判断,您可能希望查看一个数据存储,它不需要将所有内容都保存在内存中,因此速度很快
我上面提到的每个数据存储都有很多PHP驱动程序(和教程) 对于某种形式的面向键/值的NoSQL数据存储(mongodb、couchdb、Riak)(甚至可能只是一个大型memcache实例),它们似乎是一个经典的解决方案 假设您可以在需要进行搜索之前将大型数据文件加载到数据存储中,并且您将不止一次地使用加载文件中的数据,那么您应该会看到一些令人印象深刻的收益(只要您的查询、mapreduce等不是很糟糕),根据数据的大小来判断,您可能希望查看一个数据存储,它不需要将所有内容都保存在内存中,因此速度很快
我上面提到的每个数据存储都有很多PHP驱动程序(和教程)如果你真的想得到一些有用的答案,你应该提供代码和测试数据。这不是一个重复的问题,一个完全不同的问题。代码和数据如我所述,您不需要查看代码就可以理解问题。那么代码呢。也许有了一些实现细节,就更容易给出优化的提示。也许是你们读到的示例文件。我只是在你们评论的时候添加了一些代码,因为有两个人问我,我觉得这很明显。没必要粗鲁。这个问题不是重复的,但你们都花了10秒钟的时间来标记它,你们甚至不可能有时间理解这个问题。谢谢编辑。我仍然认为这是一个复制品。当内存出现问题时,您不希望将文件加载到内存中,而是按顺序读取。显然这是一个CSV文件,因为你爆炸了,所以尝试复制中给出的各种方法。如果你真的想得到一些有用的答案,你应该提供代码和测试数据。这根本不是一个重复的问题,而是一个非常不同的问题。代码和数据如我所述,您不需要查看代码就可以理解问题。那么代码呢。也许有了一些实现细节,就更容易给出优化的提示。也许是你们读到的示例文件。我只是在你们评论的时候添加了一些代码,因为有两个人问我,我觉得这很明显。没必要粗鲁。这个问题不是重复的,但你们都花了10秒钟的时间来标记它,你们甚至不可能有时间理解这个问题。谢谢编辑。我仍然认为这是一个复制品。当内存出现问题时,您不希望将文件加载到内存中,而是按顺序读取。显然,这是一个CSV文件,因为你在爆炸中尝试了复制中给出的各种方法。实际上,我已经用HIPHP将PHP转换成C++代码,所以这不是语言问题,而是一个实现问题。除非有完全不同的存储变量的方法。否则,本机C++或C数据结构比PHP更有效。自动转换必须保持原始的PHP版本。虽然我不知道如何做这件事,因为我没有C或C++的实际经验。你可以尝试任何其他的实现比PHP更有效的语言:OcAML,通用LISP,Haskell,java,…或者你可以把信息放在文件中,而不是数据库中…实际上我已经用HIPHP把PHP转换成C++代码,所以这不是语言问题,而是一个实现问题。除非有完全不同的存储变量的方法。否则,本机C++或C数据结构比PHP更有效。自动转换必须保持原始的PHP版本。虽然我不确定如何做到这一点,因为我没有C或C++的实际经验。