【发布时间】:2013-06-25 12:37:57
【问题描述】:
我已经将一个巨大的文件映射到 char 字符串中,并用它制作了一个 c++ 字符串。我需要根据作为空格字符的分隔符来解析这个字符串,并将值存储在矩阵中。我可以从一个线程做到这一点,但我需要优化它。所以我使用多个线程来解析这个 sstream 中的字符串并将其存储在 matrix 中。虽然基于线程 id,我可以将解析的数据同步存储到矩阵中,但是我如何同步解析,因为任何线程都可以随时调度并解析字符串。这是我的代码
void* parseMappedString(void* args)
{
char temp[BUFFSIZE];
long int threadID = *((long int*)args);
if (threadID < 0)
threadID = 0;
for (int i = ((threadID) * 160); i < ((threadID+1) * 160); i++)
{
for (int j = 0; j < 4000; j++)
{
pthread_mutex_lock(&ParseMatrixMutex);
if ((matrix_str.getline(temp,BUFFSIZE, ' ')) )
{
pthread_mutex_unlock(&ParseMatrixMutex);
matrix[i][j] = parseFloat((temp));
}
else
{
pthread_mutex_unlock(&ParseMatrixMutex);
}
}
}
}
void create_threads_for_parsing(void)
{
long int i;
for (i = 0; i < 5; i++)
pthread_create(&Threads[i], NULL, parseMappedString, (void*)&i);
}
如果您在代码中看到总共有五个线程,并且每个线程正在处理 160 * 4000 个元素。他们根据他们的线程 id 存储,因此存储在矩阵中的唯一位置。这样它是同步的。但是 getline 可以随时由任何线程完成,因此线程 5 可以解析属于第一个线程的数据。我该如何避免这种情况?
我不得不关注,因为我在 args 中收到 1-4 个线程 ID,但从来没有 0。它总是以一些垃圾负值的形式出现,因此我不得不像这样对其进行硬编码。
如果(线程 ID
【问题讨论】:
-
想法是线程 1 不应该解析字符串,例如178 * 278 元素,因为它属于线程 2
-
您如何期望线程 2 在不读取所有前面的元素或等待线程 1 完成读取“其”部分的情况下定位该元素?为了做你想做的事,你需要每个线程都等待前一个线程完成,所以你不会通过多线程获得任何东西。
-
是不是说没有办法优化文件读取。我需要 1.5 秒才能读取包含 4k *4k 浮点数的文本文件并将其存储在矩阵中。没办法优化???
-
您预计它的速度有多快? 1.5 秒内 1600 万次浮点数约为每个浮点数 100 纳秒,这在 3GHz CPU 上约为 300 个时钟。这还不错。如果您希望它们更快,请将它们存储为二进制以避免解析。
标签: c++ parsing pthreads sstream