【问题标题】:Only load one array (into memory) from PHP file仅从 PHP 文件加载一个数组(到内存中)
【发布时间】:2017-05-18 15:02:55
【问题描述】:

所以我有很多(数百万)条记录正在尝试处理。我已经尝试过 MongoDB 和 Neo4j,它们都只是简单地将我的双核 ubuntu 机器磨到了停止状态。

我想知道(我不相信有)是否有任何方法可以将 PHP 数组存储在一个文件中,但只将一个数组加载到内存中。比如:

<?php
$loaded = array('hello','world');
$ignore_me = array('please','ignore');
$ignore_me2 = array('please','ignore','again');
?>

我可以有效地调用$loaded 数组,但其他数组没有加载到内存中(即使它们在同一个文件中)?我知道 fread/fopen 但这往往是文件是一般文本块的地方。

如果(我怀疑)答案是否定的 - 像 NoSQL 数据库这样的东西如何不需要 a)为每条记录创建一个文件 b)将所有内容加载到内存中?我知道 Neo4j 使用 Java,但 PHP 应该能够与之匹敌!!

【问题讨论】:

标签: php arrays nosql


【解决方案1】:

你考虑过Mysql、PostgreSql、MS Sql server等关系型数据库吗?

我看到您尝试过 MongoDB(一种面向对象的数据库)和 Neo4J(一种面向节点的数据库)。

我知道 NoSQL 是一个很好的趋势,但我尝试使用 NoSQL 收集数百万条记录,但它的表现非常糟糕,以至于我切换回了关系 SQL。

如果您仍然坚持使用 NoSQL,请尝试使用 Redis 和 Memcached,它们是内存数据库。

【讨论】:

  • 嗨,我做到了。我正在使用 mysql 数据库并访问了大约 20m 行,并且发现我的插入查询需要 40/50 秒才能插入大约 100m+ 记录时的行数,这太长了。我也尝试过使用文件系统,但遇到了 inode 的问题(否则这将是我的偏好)
  • 我明白了。您是否考虑过这些:1)您是否积极需要所有 100M 记录,或者是否有一段时间可以归档它们?你能把它们分成不同的表吗? 2) 启用“慢查询日志”并研究耗时 40/50 秒
  • 3) 优化查询、表和索引 4) 确保使用 InnoDB 5) 使用 SSD 硬盘 保持插入的表简单并将其链接到另一个表。例如,如果您的表 employee 有 1 亿条记录,则您只能在该表上保留 id、name、email、phone。创建另一个名为employee_extra_attr 的表并存储address1、address2、便笺、语言等...
【解决方案2】:

您可以使用 PHP Streams 读取/写入文件。

读取文件并转换为数组

$content = file_get_contents('/tmp/file.csv'); //file.csv contains a,b,c
$csv = implode(","$content); //csv is now array('a', 'b', 'c');

写入文件

$line = array("a", "b", "c");
// create stream
$file = fopen("/tmp/file.csv","w");
// add line as csv
fputcsv($file, $line);
// close stream
fclose($file);

您还可以循环并将行添加到 csv 并循环并检索行。 https://secure.php.net/manual/en/function.fputcsv.php

您可以使用 fgetcsv 检索多行,它还保留下一行的指针以进行访问 https://secure.php.net/manual/en/function.fgetcsv.php

【讨论】:

  • 我会用 PHP fegtcsv/fputcsv 函数添加一个我发现 numerous issues 的严肃限定符; fgetcsv 非常挑剔究竟它是什么类型的 csv、选择的分隔符/字段字符以及文件中使用的字符集(BOM/无 BOM)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多