Oracle apex Oracle APEX_数据_解析器执行大文件的时间爆炸

Oracle apex Oracle APEX_数据_解析器执行大文件的时间爆炸,oracle-apex,Oracle Apex,(抱歉,没有足够的代表点对类似问题发表评论) 当apex_data_解析器处理超过50MB的文件时,执行时间会激增。 正如在这里提出的问题:,我必须同意oCoXa,解析器中一定有一个bug 我在ATP+APEX 19.2.0.00.18上发现了完全相同的问题。 我还看到在解析大于50mb的文件时IO和CPU出现峰值,低于50mb时根本没有峰值 我已经将两个文件加载到一个表(一个41_temp_文件),一个是54mb,另一个是47mb。(相同的行,直到47mb) 在这两种情况下,我只是解析文件中1

(抱歉,没有足够的代表点对类似问题发表评论)

当apex_data_解析器处理超过50MB的文件时,执行时间会激增。 正如在这里提出的问题:,我必须同意oCoXa,解析器中一定有一个bug

我在ATP+APEX 19.2.0.00.18上发现了完全相同的问题。 我还看到在解析大于50mb的文件时IO和CPU出现峰值,低于50mb时根本没有峰值

我已经将两个文件加载到一个表(一个41_temp_文件),一个是54mb,另一个是47mb。(相同的行,直到47mb) 在这两种情况下,我只是解析文件中171.000和199.000行中的3000行

我在SQLDeveloper中运行解析器,47mb需要1,9秒,54mb需要88,6秒

select * 
from A41_temp_files  f,
    table(  
            apex_data_parser.parse(
                p_content                     => f.BLOB_CONTENT,
                p_max_rows                    => 3000,
                P_DETECT_DATA_TYPES => 'N',
                p_file_name                   => f.FILENAME 
            ) 
        ) p
where 1=1
and f.filename = 'CHUCK_47mb.txt' --3000 lines    1,9sec
--and f.filename = 'CHUCK_54mb.txt' --3000 lines 88,6sec
order by col001
;

为了提高APEX_DATA_PARSER.parse的性能,预计算文件的配置文件会很有帮助(这可能非常耗时)

函数返回JSON格式的文件配置文件

select apex_data_parser.discover(
           p_content => {BLOB containing XLSX file},
           p_file_name=>'large.xlsx' ) as profile_json
from dual;

然后可以在解析函数中使用此配置文件(因此解析函数不必执行获取文件信息的附加步骤):


为了提高APEX_DATA_PARSER.parse的性能,预计算文件的概要文件(这可能会非常耗时)会很有帮助

函数返回JSON格式的文件配置文件

select apex_data_parser.discover(
           p_content => {BLOB containing XLSX file},
           p_file_name=>'large.xlsx' ) as profile_json
from dual;

然后可以在解析函数中使用此配置文件(因此解析函数不必执行获取文件信息的附加步骤):


APEX_DATA_解析器包确实有一个50MB的“阈值”

对于小于50MB的BLOB,APEX将创建一个新的缓存(!)临时LOB,复制数据并对该临时LOB执行所有解析。所以所有LOB操作都发生在内存中

如果BLOB大于50MB,则不会创建临时LOB,并且APEX_DATA_PARSER的LOB操作将在传入的LOB定位器上执行。在您的情况下,它是列A41_TEMP_FILES.BLOB_内容的LOB定位器。因此,所有LOB操作都发生在磁盘中,这使得磁盘运行速度变慢

APEX构建为在具有多个工作区和并行用户的共享实例上运行-因此此阈值是为了保护(共享)SGA和数据库内存

但是,使用APEX_DATA_PARSER包的开发人员始终可以自己创建一个缓存的临时LOB,并将其传递给APEX_DATA_PARSER.PARSE。为此,使用DBMS_LOB.CREATETEMPORARY过程和P_CACHE=>TRUE来创建临时LOB,然后使用DBMS_LOB.COPY将上传的BLOB中的数据复制到临时BLOB,然后将临时BLOB传递给APEX_data_PARSER.PARSE

例如

然后在APEX_DATA_解析器中使用此函数,如下所示:

:
apex_data_parser.parse(
     p_content                     => create_cached_blob( f.BLOB_CONTENT),
     p_max_rows                    => 3000,
:

APEX_DATA_解析器包确实有一个50MB的“阈值”

对于小于50MB的BLOB,APEX将创建一个新的缓存(!)临时LOB,复制数据并对该临时LOB执行所有解析。所以所有LOB操作都发生在内存中

如果BLOB大于50MB,则不会创建临时LOB,并且APEX_DATA_PARSER的LOB操作将在传入的LOB定位器上执行。在您的情况下,它是列A41_TEMP_FILES.BLOB_内容的LOB定位器。因此,所有LOB操作都发生在磁盘中,这使得磁盘运行速度变慢

APEX构建为在具有多个工作区和并行用户的共享实例上运行-因此此阈值是为了保护(共享)SGA和数据库内存

但是,使用APEX_DATA_PARSER包的开发人员始终可以自己创建一个缓存的临时LOB,并将其传递给APEX_DATA_PARSER.PARSE。为此,使用DBMS_LOB.CREATETEMPORARY过程和P_CACHE=>TRUE来创建临时LOB,然后使用DBMS_LOB.COPY将上传的BLOB中的数据复制到临时BLOB,然后将临时BLOB传递给APEX_data_PARSER.PARSE

例如

然后在APEX_DATA_解析器中使用此函数,如下所示:

:
apex_data_parser.parse(
     p_content                     => create_cached_blob( f.BLOB_CONTENT),
     p_max_rows                    => 3000,
:

谢谢你的建议,但没什么区别。仅供参考,两个文件的计算json_配置文件是相同的。(应该如此)。实际上,在预先添加JSON配置文件时,运行脚本需要几秒钟的时间,但这当然可能是由缓存/其他正在运行的作业等引起的。无论如何,底线是它没有解决问题。感谢您的建议,但这并没有造成任何影响。仅供参考,两个文件的计算json_配置文件是相同的。(应该如此)。实际上,在预先添加JSON配置文件时,运行脚本需要几秒钟的时间,但这当然也可能是由缓存/其他正在运行的作业等引起的。总之,它没有解决问题。这确实解决了问题。非常感谢你!就性能而言,它的性能与50MB以下的文件相当。仅供参考,我最大的文件是408MB,有160万行,需要约30分钟。因此,最终用户将获得网关超时错误。但这一过程在幕后完成得很好。因此,一旦流程完成,最终用户可以继续该流程…(在另一个页面中,查看解析/加载到接口表的数据)我对代码所做的唯一更改是添加一个if,因此只有当文件大小超过50MB时才会更改。这确实解决了问题。非常感谢你!就性能而言,它的性能与50MB以下的文件相当。仅供参考,我最大的文件是408MB,有160万行,需要约30分钟。因此,最终用户将获得网关超时错误。但这一过程在幕后完成得很好。因此,一旦流程完成,最终用户可以继续流程…(在另一个页面中,查看解析/加载到接口表的数据)我对代码所做的唯一更改是添加一个if,因此只有当文件大小超过50MB时才会更改。