Member 11807654 Ответов: 2

Как создать быстрый график из текстового файла ?


Я хочу сделать график из текстового файла, содержащего 36692 узла, и каждая строка текста содержит исходный и целевой узлы ребра графика. Я использовал библиотеку igraph для создания графика. Я написал следующий код, но он слишком медленный. как я могу прочитать весь текстовый файл в буфер памяти, чтобы сделать алгоритм быстрее?
igraph_empty(&graph, vertexNum, 0);
ifstream inputFile("Email-Enron.txt");
int v1, v2;
while( ( inputFile >>  v1 >> v2 ))
{
	igraph_add_edge(&graph, v1, v2);
}


Что я уже пробовал:

этот код работает для небольшого набора данных, но для большого набора данных он занимает много времени.

0x01AA

а) что значит "но это слишком медленно"?
Б) обычно графические библиотеки позволяют вам делать что-то вроде "StartUpdate", "EndUpdate", чтобы избежать проблем с производительностью... Это до вас, чтобы найти это для вас Lib в использовании.

Richard MacCutchan

Это очень медленный способ чтения текстового файла. Вы должны использовать что-то вроде readline, чтобы прочитать каждую строку, маркировать элементы в строке и построить массив точек. Затем передайте все точки в конструктор графиков.

Member 11807654

я тоже использовал следующий код. он читает файл очень быстро, но когда он хочет создать график, он работает медленно:

std:: ifstream in("Email-Enron.txt");
std::буфер stringstream;
буфер < & lt; in.rdbuf();
СТД::строка содержание(буфер.ул.());
for (int i=0;i< contents. size (); i+=4)
{
igraph_add_edge(&усилителя;графика, содержание[я], содержание[я+2]);
}

content. size() больше 3/000/000

Richard MacCutchan

Так что проблема на самом деле связана с библиотекой igraph.

2 Ответов

Рейтинг:
4

CPallini

Вам, наверное, лучше воспользоваться igraph_add_edges функция, предназначенная для добавления нескольких ребер одновременно, как показано на рисунке интерактивный график справочное руководство[^].


Рейтинг:
2

KarstenK

Чтение одного набора данных и добавление его в график снова и снова делает код медленным, потому что каждый раз это доступ к диску, а не добавление графика.

int countLines = vertextNum;// compute size
int *v = new int[2*countLines];//double the amount of data
int i = 0;
//read all data
for( int i =  0; i < countLines; i += 2)
{
	inputFile >>  v[i] >> v[i+1];
}
//make graph
for( int i =  0; i < countLines; i += 2)
{
	igraph_add_edge(&graph,  v[i], v[i+1] );
}
Если это возможно, отключите пересчет или рисование графика в процессе загрузки.

Для выпуска кода comimg используются некоторые оптимизационные флаги в компиляторе и компоновщики в релевантности, такие как разворачивание.

Совет: действительно быстрое решение будет заключаться в том, что байты int находятся в двоичном файле, и вы можете прочитать их напрямую. Это сделало бы эту единственную одну строку чтения:
inputFile.read( (char*)v, sizeof(unsigned int) * 2 * countLines);

Данные были записаны таким образом
outputFile.write( (char*)v, sizeof(unsigned int) * 2 * countLines);