来自Qt库的mapreduce是否保留了输入文件的顺序?

时间:2014-03-28 15:36:35

标签: c++ qt mapreduce

    WordCount countWords(const QString &file)
    {
        QFile f(file);
        f.open(QIODevice::ReadOnly);
        QTextStream textStream(&f);
        WordCount wordCount;

        while (textStream.atEnd() == false)
            foreach (QString word, textStream.readLine().split(" "))
                wordCount[word] += 1;

        return wordCount;
    }

...

QStringList files = findFiles("../../", QStringList() << "*.cpp" << "*.h");

...

int mapReduceTime = 0;
{
    QTime time;
    time.start();
    WordCount total = mappedReduced(files, countWords, reduce);
    mapReduceTime = time.elapsed();
    qDebug() << "MapReduce" << mapReduceTime;
}

假设我想跟踪我正在处理哪个文件,我可以创建一个全局静态变量,并在每次开始运行时递增它,在countWord函数内部知道我正在对文件进行一些处理1号?或者是否无法知道将首先处理哪些文件?我问,因为mapreduce允许并行处理,但我不知道操作系统将如何安排线程。

1 个答案:

答案 0 :(得分:0)

不可能准确地知道处理的顺序是什么,因为每个映射操作通常会花费不同的时间。

一个简单的解决方案是不处理原始文件列表,而是处理(索引,文件名)对的列表。

您还应该跳过空字符串,并至少处理打开给定文件以进行读取的失败。写作boolExpr == false的惯用方法只是! boolExpr

typedef QPair<int, QString> FileEntry;

WordCount countWords(const FileEntry &entry)
{
    WordCount wordCount;
    QFile f(entry.second);
    if (!f.open(QIODevice::ReadOnly)) return wordCount;
    QTextStream ts(&f);

    while (!ts())
      foreach (QString word, ts().split(" ", QString::SkipEmptyParts))
        wordCount[word] ++;

    return wordCount;
}

QStringList f = findFiles("../../", QStringList() << "*.cpp" << "*.h");
QList<FileEntry> fileEntries;
fileEntries.reserve(f.size());
int i = 0;
foreach (QString file, f)
  fileEntries << qMakePair(i++, file); 
mappedReduced(fileEntries, countWords, reduce);