1

サイズが約 50M、約 10k レコードの json ファイルがあります。私は次のコードを使用して Joomla にプログラム的に挿入しています。関連するすべてのテーブルが同時に更新されるため、うまく機能します (#_assets など)。どうにかしてプロセスをスピードアップできますか?

、 などに挿入する#_content#_tags、はるかに高速になることはわかっていますが、そのアプローチには、回避しようとするトリビアの複雑さがいくつかあります。

<?php
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );

require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
require_once (JPATH_BASE . DS . 'libraries' . DS . 'joomla' . DS . 'factory.php' );

define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_BASE . DS . 'administrator' . DS . 'components' . DS . 'com_content');

$mainframe = JFactory::getApplication('site');

require_once (JPATH_ADMINISTRATOR.'/components/com_content/models/article.php');

$string = file_get_contents("items.json");
$json_str = json_decode($string, true);
foreach($json_str as $row){
$new_article = new ContentModelArticle();
    $data = array(
        'title' => $row['title'][0],
        'alias' => $row['alias'],
        'introtext' => $row['content'],
        'state' => 1,
        'catid' => 8,           /* don't hard code here! */
        'created' => $row['pdate'][0],
        'created_by' => 798,
        'created_by_alias' => $row['poster'][0],
        'publish_up' => $row['pdate'][0],
        'urls' => $row['urls'],
        'access' => 1,
        'metadata' => array(
            'tags' => $row['tags'],
            'robots' => "",
            'author' => implode(" ", $row['poster']),
            'rights' => "",
            'xreference' => "",            
        ),
    );
$new_article->save($data);
}
4

1 に答える 1

0

これを拡張機能として Joomla で実行している場合は、デバッグをオンにして を調べて、どこですべての時間が費やされているかを確認することをお勧めしProfile InformationますJoomla! Debug Console

あなたはそうではないので、残りは控除です(したがって、おそらく欠陥があります)。

  1. for each insert をロードしています。ContentModelArticleこれは、各行のモデル クラスだけでなく、各行のテーブル クラスも作成および破棄することを意味します。

  2. これらがすべて挿入である場合、モデルのすべてのオーバーヘッドは必要ありません (たとえば、記事が最初に存在するかどうかを確認するなど)。

  3. prepareTable()データがすべて有効な場合は、コンテンツ モデルでもcheck()コンテンツ テーブルでもデータの準備 ( ) は必要ありません。

一度ロードする必要がない場合は、記事ごとに配列を渡しJTableてテーブル オブジェクトを呼び出します。save()これにより、アセット トラッキングが更新される , bind(), check()—が実行され、挿入が完了します。store()

だから、あなたはこのようなことを試すことができます.どれだけ速くなるかはわかりません.

$contentTable = JTable::getInstance('Content', 'JTable', array());
foreach($json_str as $row){
    $data = array(
        'title' => $row['title'][0],
        'alias' => $row['alias'],
        'introtext' => $row['content'],
        'state' => 1,
        'catid' => 8,           /* don't hard code here! */
        'created' => $row['pdate'][0],
        'created_by' => 798,
        'created_by_alias' => $row['poster'][0],
        'publish_up' => $row['pdate'][0],
        'urls' => $row['urls'],
        'access' => 1,
        'metadata' => array(
        'tags' => $row['tags'],
        'robots' => "",
        'author' => implode(" ", $row['poster']),
        'rights' => "",
        'xreference' => "",            
    ),
    $contentTable->save($data);
}

*免責事項:これはテスト済みのコードではなく、私の頭から出てブラウザーに組み込まれているだけです。

于 2013-06-30T00:01:07.287 に答える