繁体   English   中英

从Windows共享目录并行读取文件

[英]Reading files from a windows shared directory in parallel

我有一台服务器,该服务器从Windows共享目录中读取文本文件列表,并将其内容保存到db,然后该数据库开始接受用户消息。 该服务器将同时在多台计算机上运行。

我看到当我在多台计算机上运行服务器时,服务器开始处理文件,首先处理所有文件,而其他服务器则一直在等待访问该目录中的文件。

我的代码可以执行此操作-(由于安全政策而无法发布代码)

  1. 获取共享目录中所有文件的列表。
  2. 按修改日期对它们进行排序(其保存时间序列数据)
  3. 虽然(true)直到目录中存在更多文件
  4. 获取列表中的第一个文件,然后将其移至InProgess文件夹并阅读
  5. 将内容保存到数据库。
  6. 将文件移动到存档目录。
  7. 处理下一个文件。

我看到当我在2台不同的计算机上运行相同的程序时,其中一台首先获取文件的所有权并全部加载。 另一个人一直在等待获取文件的句柄,如果找到了句柄,则说明它们已经被处理。 因此,它继续前进。

我的目标是使该过程在两台或多台计算机上运行时可以并行处理所有文件并更快地完成。 目前,我正在测试磁盘上有500个文件,但是在任何给定时间我可以在磁盘上有更多文件。

伪代码-

if(files exist on disk){
    LOGGER.info("Files exist on disk. Lets process them up first....");
    while (true) {
        File dir = new File(directory);
        List<File> fileList = new LinkedList<File>(Arrays.asList(dir.listFiles((FileFilter)FileFileFilter.FILE)));
        LOGGER.info("No of files in this process: "+ sortedFileList.size());
        if (fileList.size() > 0) {
            Collections.sort(fileList, new Server().new FileComparator());
            File file = fileList.get(0);

            //If I cannot rename the file in the same directory, the file maybe open and I move to the next file       
            if(!file.renameTo(file.getAbsoluteFile())) {
                LOGGER.info("Read next file...");
                continue;
            }
            LOGGER.info("Get file handle...");
            if (file.exists()) {
                File inprogressFile = new File(dataDirName + FileBackupOnDisk.INPROGRESS + fileName);
                saveToDB(inprogressFile);
                if (savedToDB) 
                    if(inprogressFile.renameTo(new File(dataDirName+ARCHIVE+fileName)))
                    LOGGER.info("Moved file to archive - " + fileName);
                else        
                    LOGGER.error("Move file " + fileName + " to failed directory!");
            }
        }
    }
}

那是我的文件比较器代码。 这无法打开文件-

final Map<File, Long> staticLastModifiedTimes = new HashMap<File,Long>();
    for(final File f : sortedFileList) {                                       
        staticLastModifiedTimes.put(f, f.lastModified());
    }

    Collections.sort(sortedFileList, new Comparator<File>() {
        @Override
        public int compare(final File f1, final File f2)  {
            return           
    staticLastModifiedTimes.get(f1).compareTo(staticLastModifiedTimes.get(f2));
    }
});

如何确保我在不同计算机上运行的服务器/多台服务器都能够直接并行访问共享。 现在,似乎第二个进程发现该目录中存在文件,但挂起一时等待获取文件句柄。

让我知道以前是否有人这样做过以及如何进行?

我发现上面的解决方案效果很好!!!! 只是从我的日食运行一个实例,然后从网络中的am / c运行另一个实例,导致了此延迟问题。 如果我在同一网络中的两台计算机上运行该程序,则可以正常运行。 只是我的电脑速度较慢。 两个实例都可以在读取文件时对其进行处理。 谢谢大家的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM