csvファイルを読み込むためにparsecsv.lib.phpというライブラリを使用していました。ただし、ファイルのサイズは大きくなり、約 30 MB になりました。このライブラリは、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);
}
これは、一度に 1 行ずつ読み取り、キーをヘッダーとして保存してから保存します。
私の質問は、保存メソッドに供給しているデータの量をチャンク化した場合、速度が向上するかどうかです。現時点では、一度に 1 つの配列しかありませんが、配列の配列をフィードして保存することができます。データをチャンク化する利点があるかどうかはわかりません。経験者なら誰でも洞察力がある
保存方法は次のとおりです。
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());
}