同声 2019-08-02 11:55 采纳率: 50%
浏览 404

怎么提高AGILE PLM文件下载速度(多线程或并行编程)

1描述:公司最近在做Agile PLM系统二次开发,需要把旧PLM系统物料的附件迁移到新的PLM系统中,大概有50000个左右物料,每个物料的附件有3到4个,附件大概都有几兆吧,不我能统计太多文件大小。旧系统使用的API.jar包不能与新系统共用,
所以我初步处理方式是:
先创建java工程A(old_AgileAPI.jar匹配 jdk7 )从旧PLM系统中将物料的附件下载到本地,再创建java工程B(new_AgileAPI.jar 匹配jdk8)根据新旧物料对照表,将本地已下载的附件上传到新系统中。在 java工程A中测试了的下载文件的速度,下载40个物料的文件大概花费2分钟,由此可知如果要把旧系统的所有物料附件下载完,估计要花费40多个小时,这样做花费时间太久了,我当前的电脑配置Intel I5 ,CPU 4核心。

2、问题: 有什么好的方案可以加快下载文件?采用什么方法可以将文件从旧系统迁移到新系统?这个可能涉及到并行编程方面,我对这一块不是很熟悉。
从旧系统下载文件与将文件上传到新系统,都需要先用户认证获取session后才能操作。代码如下:

public static IAgileSession getSession(){
        IAgileSession session = null;
        if (session == null) {
            HashMap<Integer, String> params = new HashMap<Integer, String>();
            params.put(AgileSessionFactory.USERNAME, "**");
            params.put(AgileSessionFactory.PASSWORD, "**");
            params.put(AgileSessionFactory.URL, "http://***:***/**");
            try {
                session = AgileSessionFactory.createSessionEx(params);               
            } catch (APIException e) {
                e.printStackTrace();
            }
        }
        return session;
    }
public void execute( String oldPart) throws APIException {      
             IAgileSession session=getSession();        
             IItem item = (IItem) session.getObject(ItemConstants.CLASS_ITEM_B     ASE_CLASS,oldPart);
         ITable attachTables  = item.getTable(ItemConstants.TABLE_ATTACHMENTS);   

      ......................

        IAttachmentFile att = (IAttachmentFile)row;
          InputStream inputStream = att.getFile();               
                     //创建新物料           
        FileHelper.download(inputStream,partPath,fileName);

            ......................
}   

如果采用多线程去下载物料的附件,在每个子线程中调用getSession()创建各自的会话,还是在类中创建一个会话共享给所有的子线程呢?

  • 写回答

1条回答 默认 最新

  • 明初啥都能学会 2024-04-28 16:48
    关注

    该回答引用ChatGPT3.5,结果代码方法已验证可行

    针对你的问题,有一些优化方案可以考虑以加快文件下载的速度,并且可以采用并行编程的方式来处理。以下是一些可能的解决方案:

    1. 多线程下载
      你可以使用多线程来同时下载多个物料的附件。每个线程可以负责下载一个或多个物料的附件,从而加快整体下载速度。在每个线程中都调用getSession()方法来获取会话,确保并发操作时的线程安全性。

    2. 连接池
      考虑使用连接池管理会话的创建和释放。通过使用连接池,可以避免频繁地创建和销毁会话对象,从而提高效率。你可以使用开源的连接池库,如Apache Commons Pool,来实现连接池功能。

    3. 优化网络请求
      可以尝试优化网络请求,减少不必要的网络延迟。例如,可以通过增加并发连接数、减少单个请求的等待时间等方式来提高网络通信的效率。

    4. 使用异步IO
      如果你使用的API支持异步IO操作,可以考虑使用异步IO来提高文件下载的效率。异步IO可以在等待文件下载的同时执行其他任务,从而更充分地利用系统资源。

    5. 增加服务器资源
      如果可能的话,可以考虑增加旧系统的服务器资源,以提高文件下载的速度。例如,增加服务器的带宽、CPU、内存等资源,可以有效地提升系统的性能。

    6. 数据压缩
      如果文件的传输速度受限于网络带宽,可以考虑对文件进行压缩,减小文件的大小,从而减少传输时间。你可以在下载文件之前将文件进行压缩,然后在上传到新系统之前进行解压缩。

    对于文件上传到新系统的部分,也可以采用类似的优化方案,例如使用多线程并发上传、使用连接池管理会话等。在实施这些方案时,需要注意线程安全性和资源管理,以避免可能的并发问题和内存泄漏。

    评论

报告相同问题?