Exemple #1
0
    static void commitLoop(lmdbGallery * base)
    {
        QSharedPointer<caffe::db::Transaction> txn;

        int total_count = 0;

        // Acquire the lock
        QMutexLocker lock(&base->dataLock);

        while (true) {
            // wait for data, or end signal
            while(base->data.isEmpty() && !base->should_end)
                base->dataWait.wait(&base->dataLock);

            // If should_end, but there is still data, we need another commit
            // round
            if (base->should_end && base->data.isEmpty())
                break;

            txn = QSharedPointer<caffe::db::Transaction>(base->db->NewTransaction());

            TemplateList working = base->data;
            base->data.clear();

            // no longer blocking dataLock
            lock.unlock();

            foreach(const Template &t, working) {
                // add current image to transaction
                caffe::Datum datum;
                caffe::CVMatToDatum(t.m(), &datum);

                QVariant base_label = t.file.value("Label");
                QString label_str = base_label.toString();


                if (!base->observedLabels.contains(label_str) )
                    base->observedLabels.insert(label_str, base->observedLabels.size());

                datum.set_label(base->observedLabels[label_str]);

                std::string out;
                datum.SerializeToString(&out);

                char key_cstr[256];
                int len = snprintf(key_cstr, 256, "%08d_%s", total_count, qPrintable(t.file.name));
                txn->Put(std::string(key_cstr, len), out);

                total_count++;
            }

            txn->Commit();
            lock.relock();
        }