1

データベースが小さくてレコードが少ない場合に正常に動作するこのコードがありました.jsonをファイルに適切に書き込みますが、データが巨大な場合はタイムアウトします

<cfloop list="t" index="k">
            <cfquery name="qry">
                select * from #k# 
            </cfquery>
            <cfset js= serializeJSON(qry,'struct')>         
            <cffile action="write" file="#k#" output="#js#">
        </cfloop>

スレッドを使用してみましたが、それらも機能していません。使用すると、値のない空のテーブルファイルが作成されるだけcfthreadですjoins

ファイルをテーブルごとに1000レコードの組み合わせに分割し、次のようにすることを考えました

同じテーブルの table_1、table2、table3、これは何百万ものレコードがあり、レコードが 1000 未満の場合はスキップして、1 つのファイルのみを作成します。

しかし、どのアプローチが最適かを考えているだけで、出発点が必要です

4

3 に答える 3

0

他の人は JVM とガベージ コレクションに触れましたが、CF が GC を処理する方法による潜在的な迅速な勝利についてはフォローアップしていません。

CF は、各関数が返された後、および各要求の最後にも GC できます。したがって、ループ内で大量のメモリを数回使用することを行う場合、またはループ内で適度な量のメモリを使用することを何度も行う場合は、その「何か」を関数に抽象化し、ループ内でその関数を使用することで、必要に応じて繰り返しごとにメモリを解放できるようにします。これは、要求が終了するまでメモリが保持され、要求が終了するガベージ コレクションの前にヒープ領域を使い果たす可能性があるためです。

たとえば、元のコードをこれにリファクタリングすると、はるかに GC フレンドリーになります。

<cffunction name="tableToFile" output="false">
    <cfargument name="tableName" type="variableName" required="true" />
    <cfquery name="local.qry">
        select * from #arguments.tableName#
    </cfquery>
    <cfset local.js = serializeJSON(local.qry,'struct') />
    <cffile action="write" file="#arguments.tableName#" output="#local.js#" />
</cffunction>

<cfloop list="t" index="k">
    <cfset tableToFile(tableName=k) />
</cfloop>

ただし、クエリが大きすぎるためにそのループの 1 回の反復で大量のメモリが消費される場合、このアプローチでは問題は解決されません。それがあなたの問題である場合は、これをアレックスのようなバッチで行をフェッチするアプローチと組み合わせて実装する必要があります. JSON シリアライゼーション。

于 2020-07-06T12:44:12.640 に答える