簡體   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