使用目录扫描运算符处理具有特定扩展名的大文件

时间:2017-06-14 20:31:59

标签: data-ingestion ibm-streams

我有一个1GB +大小的文件从MQ进入我的目录,这需要一些时间来完全传输文件,但是即使它不是一个完整的文件,也会在该目录中生成一个文件。 我担心我的directoryScan操作员会选择一个不完整的文件。 此外,我无法添加初始延迟,因为我不确定传输文件需要多长时间。

PS:我在某处读到某些文件传输协议通过在文件完成之前添加不同的扩展来处理这个问题。所以说我的directoryScan操作符正在等待任何扩展名为.txt的文件,因此这个文件传输协议将创建一个扩展名为.abc的文件,直到传输完成。

我应该怎么做呢?

1 个答案:

答案 0 :(得分:0)

如果您打算使用正则表达式路由,这里是一个调用运算符只读取某个扩展名的文件的示例:

   // DirectoryScan operator with an absolute file argument and a file name pattern         
stream<rstring name> Dir2 = DirectoryScan()                                        
{                                                                                        
  param                                                                                  
    directory : "/tmp/work";                                                             
   pattern : "\\.txt$";                                                                 
}   

如果这不起作用,是否可以设置MQ将文件写入另一个目录,然后在完成后将其移动到目标目录中?

如果您知道文件的大小,可以做的一件事是使用Size()函数忽略文件,直到它的大小合适。此代码段使用Custom运算符等待文件大小至少为2000个字节。

graph
        stream <rstring filename, uint64 size> DirScanOutput = DirectoryScan() {
            param
                directory: "test1";
                sleepTime: 10.0; //wait 10s between scans
                pattern: ".*\\.txt";

          output DirScanOutput : size= Size();
        } 


        stream<rstring file> FileNameStream= Custom(DirScanOutput as In){
            logic
                onTuple In:{
                    if (size < 2000ul){
                        printStringLn("Required size not met yet.");
                    } else {
                        printStringLn("Size of file reached.");
                        submit({file=filename}, FileNameStream);

                    }
                }
        }

        stream <cityData> CityDataRecord = FileSource(FileNameStream) {
            param
                format: csv;
        } 

我希望其中一条建议适合你。