-1

こんにちは、あなたが私を助けてくれることを願っています! データをdbに入れるには、巨大なファイルを小さく分割する必要があります。私は多くの投稿を読んで、本当に良いものを見つけました。これは次の URL です。

PHP で大きな XML ファイルを小さなファイルに分割するにはどうすればよいですか?

1. 400.000 レコードの xml を読み取らなければならず、スクリプトは 170.000 で停止しますが、どうすればよいかわかりません。何か変更が必要ですか? 2. データを入れることはできますか?3. 巨大なファイルを読まなければならず、ブラウザがクラッシュします。簡単な方法で Mac の URL からデータを読み取ることができるソフトウェアを知っていますか?

本当にありがとう!

XML ファイルに関する詳細情報:

xml 形式をコピーして貼り付けます。3 つのドットの代わりに情報があります。

<?XML version=“1.0” encoding=“UTF-8” ?> 

<vortigo> 

<annuncio> 

<id_annuncio> <![CDATA[ . . . ]]> </id_annuncio> 
<link> <![CDATA[ . . . ]]> </link> 
<titolo> <![CDATA[ . . . ]]> </titolo> 
<tipo_contratto> <![CDATA[ . . . ]]> </tipo_contratto> 
<tipologia> <![CDATA[ . . . ]]> </tipologia> 
<descrizione> <![CDATA[ . . . ]]> </descrizione> 

<classe_energetica> <![CDATA[ . . . ]]> </classe_energetica>
<indice_energetica> <![CDATA[ . . . ]]> </indice_energetica>
<numero_stanze> <![CDATA[ . . . ]]> </numero_stanze>
<numero_bagni> <![CDATA[ . . . ]]> </numero_bagni>
<superficie> <![CDATA[ . . . ]]> </superficie>
<stato_immobile> <![CDATA[ . . . ]]> </stato_immobile>
<prezzo> <![CDATA[ . . . ]]> </prezzo> 
<prezzo_giorno> <![CDATA[ . . . ]]> </prezzo_giorno>
<prezzo_settimana> <![CDATA[ . . . ]]> </prezzo_settimana>
<prezzo_scontato> <![CDATA[ . . . ]]> </prezzo_scontato>

<comune> <![CDATA[ . . . ]]> </comune> 
<nazione> <![CDATA[ . . . ]]> </nazione> 
<regione> <![CDATA[ . . . ]]> </regione> 
<provincia> <![CDATA[ . . . ]]> </provincia> 
<indirizzo> <![CDATA[ . . . ]]> </indirizzo> 
<cap> <![CDATA[ . . . ]]> </cap>
<zona> <![CDATA[ . . . ]]> </zona>
<longitudine> <![CDATA [ . . . ]]> </longitudine>
<latitudine> <![CDATA[ . . . ]]> </latitudine>
<data_aggiornamento> <![CDATA[ . . . ]]> </data_aggiornamento> 
<immagini>

<immagine>
<immagine_url> <![CDATA[ . . . ]]> </immagine_url>
<immagine_titolo> <![CDATA[ . . . ]]> </immagine_titolo>
</immagine>

<immagine>
<immagine_url> <![CDATA[ . . . ]]> </immagine_url>
<immagine_titolo> <![CDATA[ . . . ]]> </immagine_titolo>
</immagine>

...
</immagini> 

<tipo_venditore> <![CDATA[ . . . ]]> </tipo_venditore>
<agenzia_nome> <![CDATA[ . . . ]]> </agenzia_nome> 
<agenzia_comune> <![CDATA[ . . . ]]> </agenzia_comune> 
<agenzia_email> <![CDATA[ . . . ]]> </agenzia_email> 
<agenzia_url> <![CDATA[ . . . ]]> </agenzia_url> 

<piscina> <![CDATA[ . . . ]]> </piscina> 
<giardino> <![CDATA[ . . . ]]> </giardino> 
<condizionatore> <![CDATA[ . . . ]]> </condizionatore> 
<riscaldamento> <![CDATA[ . . . ]]> </riscaldamento> 
<balcone> <![CDATA[ . . . ]]> </balcone> 
<terrazzo> <![CDATA[ . . . ]]> </terrazzo> 
<ascensore> <![CDATA[ . . . ]]> </ascensore> 
<cucina> <![CDATA[ . . . ]]> </cucina> 
<arredato> <![CDATA[ . . . ]]> </arredato> 
<parcheggio> <![CDATA[ . . . ]]> </parcheggio> 

<portale> <![CDATA[ . . . ]]> </portale> 
<tipo_portale> <![CDATA[ . . . ]]> </tipo_portale> 
<logo_portale> <![CDATA[ . . . ]]> </logo_portale> 

</vortigo>

情報は、各データのすべての列とともにデータベースに入力されます。よろしくお願いします!!!!

4

2 に答える 2

2

XML を解析するためにどのコードを使用していますか? あなたが参照している質問に答えたのでSimpleXML、非常に遅く、メモリを集中的に使用するため、easy を使用しないでください。以下は XMLReader-Class の簡単な例です。この XMLReader-Class は、ファイル全体を読み取るのではなくストリーミングするため、大きなファイルで非常に効率的に機能します。

$xml = new XMLReader();
$xml->open('file.xml');

while ($xml->read()) {
    // elements only. skipp element end-tags and cdata etc
    if ($xml->nodeType == XMLReader::ELEMENT) {

          // process the Elements e.g. in a switch statement:
          switch ($xml->name) {
                //...
          }
    }
}

switch関数を介してコンテンツにアクセスできるため、たとえば -Statementに変更を適用できます$xml->readOuterXML()。コンテンツに簡単にアクセスしたい場合は、特定の部分をSimpleXMLElement再度解析することをお勧めします。

 $elem = new SimpleXMLElement($xml->readOuterXML());

完了したら、次のエントリのためにメモリを解放することをunset忘れないでください。$elem私はまったく同じ方法を使用し、適切なメモリ使用量で 2 秒で 10k エントリを解析できます。

最後の質問: コンテンツをサブパートに分割したい場合があります。または、ファイルをダウンロード可能にして、ユーザーが自分のコンピューターで全体として開くことができるようにします。残念ながら、HTTP は最速のプロトコルではなく、大量のファイル サイズに対応するようにも設計されていません。

編集:あなたのサンプルデータと一致するように、github の要点を更新しました。たとえば、<immagini>ネストされたループが必要なため、さらに構成が必要になる場合があります。しかし、この問題を解決する方法についての良いアイデアが得られます。

于 2013-06-05T11:16:15.427 に答える
0

ほとんどの場合、次のいずれかの理由でスクリプトがクラッシュします。1) PHP スクリプトのメモリ/時間制限。php.ini ファイルで設定できます。 2) XML の値が正しくありません。使用するパーサー スクリプトでは解析できません。

于 2013-06-05T11:04:36.483 に答える