我正在使用一个名为 parsecsv.lib.php 的库来读取 csv 文件。然而,这些文件的大小已经增长到大约 30MB。该库尝试将 csv 的全部内容加载到一个数组中,该数组正在变成具有超过 100,000 个元素的数组。这显然不好,所以我推出了自己的解决方案,如下所示:
private static function _get2DArrayFromCsvAndSave($file, $delimiter, $enclosure, $table)
{
ini_set('auto_detect_line_endings', TRUE);
if (($fp = fopen($file, "r")) !== FALSE)
{
$headers = fgetcsv($fp, 0, $delimiter, $enclosure);
while (($row = fgetcsv($fp, 0, $delimiter, $enclosure)) !== FALSE)
{
$data = array();
foreach ($headers as $i => $col)
{
$data[$col] = $row[$i];
}
self::_save($table, $data);
echo "*";
}
}
fclose($fp);
}
这是一次读取一行并使用键作为标题保存,然后保存。
我的问题是,如果我将提供给我的保存方法的数据量分块,我是否会提高速度。现在它一次只有一个数组,但我可以给它一个数组数组并保存它们。我只是不确定分块数据是否有任何优势。任何有经验的人都有任何见解
这是保存方法:
private static function _save($table, $data)
{
$save = array();
$i = 0;
foreach ($data as $key => $value)
{
$key = '`'.strtolower(str_replace(' ', '', $key)).'`';
// this sets the primary key for NotORM's insert_update method
if ($i == 0)
$id = $key;
$i++;
$save[$key] = trim($value);
}
self::$db->$table->insert_update(
array($id => $save[$id]),
$save,
array());
}