0

私は大学での講義のプロジェクトに取り組んでおり、現在 2 週間以上解決策を探していますが、うまくいきません。

特定の JSON または XML ファイルを生成して、後で D3 や Sigma などで視覚化する必要があるプロジェクトがあります。

mysql データベースがあり、すべてのコードは Javascript で記述されており (ライブラリでわかるように)、pho を使用してデータベースからデータを取得し、適切な形式で取得します。php で作成しようとした xml ファイルの例を次に示します (Sigma で視覚化するための gexf ファイルですが、xml とまったく同じです)。

<?xml version="1.0" encoding="UTF-8"?>
<gexf xmlns="http://www.gexf.net/1.2draft" version="1.2">
<meta lastmodifieddate="2009-03-20">
    <creator>Gexf.net</creator>
    <description>A hello world! file</description>
</meta>
<graph mode="static" defaultedgetype="directed">
    <nodes>
        <node id="0" label="Hello" />
        <node id="1" label="Word" />
    </nodes>
    <edges>
        <edge id="0" source="0" target="1" />
    </edges>
</graph>
</gexf>

そして、ここに私がxmlを作成しようとした私のphpコードがあります:

    <?php

set_time_limit(500000000);

ini_set('memory_limit', '-1');

class XmlWriter2 {
var $xml;
var $indent;
var $stack = array();
function XmlWriter($indent = '  ') {
    $this->indent = $indent;
    $this->xml = '<?xml version="1.0" encoding="utf-8"?>'."\n";
}
function _indent() {
    for ($i = 0, $j = count($this->stack); $i < $j; $i++) {
        $this->xml .= $this->indent;
    }
}
function push($element, $attributes = array()) {
    $this->_indent();
    $this->xml .= '<'.$element;
    foreach ($attributes as $key => $value) {
        $this->xml .= ' '.$key.'="'.htmlentities($value).'"';
    }
    $this->xml .= ">\n";
    $this->stack[] = $element;
}
function element($element, $content, $attributes = array()) {
    $this->_indent();
    $this->xml .= '<'.$element;
    foreach ($attributes as $key => $value) {
        $this->xml .= ' '.$key.'="'.htmlentities($value).'"';
    }
   $this->xml .= '>'.htmlentities($content).'</'.$element.'>'."\n";
}
function emptyelement($element, $attributes = array()) {
    $this->_indent();
    $this->xml .= '<'.$element;
    foreach ($attributes as $key => $value) {
        $this->xml .= ' '.$key.'="'.htmlentities($value).'"';
    }
    $this->xml .= " />\n";
}
function pop() {
    $element = array_pop($this->stack);
    $this->_indent();
    $this->xml .= "</$element>\n";
}
function getXml() {
    return $this->xml;
}
}
/*
$xml = new XmlWriter2();
$array = array(
array('monkey', 'banana', 'Jim'),
array('hamster', 'apples', 'Kola'),
array('turtle', 'beans', 'Berty'),
);
$xml->push('zoo');
foreach ($array as $animal) {
$xml->push('animal', array('species' => $animal[0]));
$xml->element('name', $animal[2]);
$xml->element('food', $animal[1]);
$xml->pop();
}
$xml->pop();
print $xml->getXml();
<?xml version="1.0" encoding="utf-8"?>
<zoo>
  <animal species="monkey">
    <name>Jim</name>
    <food>banana</food>
  </animal>
  <animal species="hamster">
    <name>Kola</name>
    <food>apples</food>
  </animal>
  <animal species="turtle">
    <name>Berty</name>
    <food>beans</food>
  </animal>
</zoo>
*/

mysql_connect("127.0.0.1", "root", "manager") or die(mysql_error()); 

mysql_select_db("enrondata") or die(mysql_error()); 

$data1 = mysql_query("SELECT DISTINCT sId FROM mailToId WHERE date 
BETWEEN '01.06.2002' AND '30.06.2002' UNION SELECT DISTINCT rId FROM 
mailToId WHERE date BETWEEN '01.06.2002' AND '30.06.2002'") or die 
(mysql_error()); 

$data2 = mysql_query("SELECT sender, recipient, count(*) AS numMails 
FROM mailTo WHERE date BETWEEN '01.06.2002' AND '30.06.2002' GROUP 
BY sender, recipient") or die (mysql_error()); 

$users = array();
$id = 0;
while($tmpUsers = mysql_fetch_array($data1)){
$tmpArray['id'] = $tmpUsers['sId'];
$user = mysql_query("SELECT email FROM users WHERE id=".$tmpUsers['sId']);
while($tmpUser = mysql_fetch_array($user)){
    $tmpArray['email'] = $tmpUser['email'];
}
array_push($users, $tmpArray);
}
$xml = new XmlWriter2();
$xml->push('gexf', array('xmlns' => 'http://www.gexf.net/1.2draft" version="1.2'));
$xml->push('meta', array('lastmodifieddate' => '2009-03-20'));
    $xml->element('creator', 'Gexf.net');
    $xml->element('description', 'A hello world! file');
$xml->pop();
$xml->push('graph', array('mode' => 'static', 'defaultedgetype' => 'directed'));
    $xml->push('nodes');
        for($i = 0; $i < count($users); $i++){
            $xml->push('node', array('id' => $users['id'], 
'label' => $users['email']));$xml->pop();
    }
    $xml->pop();
    $xml->push('edges');
        while($tmp = mysql_fetch_array($data2)){
            $xml->push('edge', array('id' => id, 
'source' => $tmp['sender'], 'target' => $tmp['recipient'], 'weight' 
=> $tmp['numMails']));$xml->pop();
            $id++;
        }
    $xml->pop();
$xml->pop();
$xml->pop();
print $xml->getXml();
?>

コードは正しいですが、何時間もかかります。本当に、30分経ってもまだ終わっていません。そして、それを改善して非常に速く取得する方法がわかりません。または、php を使用せずに mysql データベースから適切な形式でデータを取得する別の可能性はありますか?

私を助けてください。締め切りが迫っていますが、アイデアがなく、自分の問題に合うものがウェブ上で見つかりませんでした。

4

1 に答える 1

0

500,000 を超えるクエリを実行すると、オーバーヘッドが大きくなります。最初のクエリでメールに参加してみてください。

/* puggan added left join email */
$data1 = mysql_query("SELECT DISTINCT mailToId.sId, users.email FROM mailToId LEFT JOIN users ON (users.id = mailToId.sId) WHERE date BETWEEN '01.06.2002' AND '30.06.2002' UNION SELECT DISTINCT mailToId.rId, users.email FROM mailToId LEFT JOIN users ON (users.id = mailToId.rId) WHERE date BETWEEN '01.06.2002' AND '30.06.2002'") or die(mysql_error()); 

$data2 = mysql_query("SELECT sender, recipient, count(*) AS numMails FROM mailTo WHERE date BETWEEN '01.06.2002' AND '30.06.2002' GROUP BY sender, recipient") or die (mysql_error()); 

$users = array();
$id = 0;

while($tmpUsers = mysql_fetch_array($data1))
{
    $tmpArray['id'] = $tmpUsers['sId'];

    /* Puggan added: */
    $tmpArray['email'] = $tmpUsers['email'];

    // $user = mysql_query("SELECT email FROM users WHERE id=".$tmpUsers['sId']);
    // while($tmpUser = mysql_fetch_array($user))
    // {
    //  $tmpArray['email'] = $tmpUser['email'];
    // }
    array_push($users, $tmpArray);
}
于 2012-06-28T15:49:39.980 に答える