如何从文件中快速读取矩阵

How can I quickly read a matrix from a file?

本文关键字:读取 文件      更新时间:2024-04-28

我在以下格式的文件中存储了数字:

12766 961 2595
19427 11518 9233

但这样的套数有40万套。如何从文件中快速读取它们?

ifstream file_for_reading("C:\Tests\21");
short number_of_vertexes;
int edge;
file_for_reading >> number_of_vertexes >> edge;
if (number_of_vertexes < 1 || number_of_vertexes > 30000 || edge < 0 || edge>400000) { cout << "Correct your vallues"; exit(1); };
int tmp = 0;
short i;
short** matrix = new short* [edge];
for (tmp = 0; tmp < edge; tmp++)
matrix[tmp] = new short[3];
unsigned int first_vertex, second_vertex, edge_size;
i = 0;
while (!file_for_reading.eof()) {
for (tmp = 0; tmp < edge; tmp++) {
file_for_reading >> matrix[tmp][i] >> matrix[tmp][i + 1] >> matrix[tmp][i + 2];
i = 0;
}
}
for (tmp = 0; tmp < edge; tmp++) {
for (i = 0; i < 3; i++) {
cout << matrix[tmp][i] << " ";
}
cout << endl;
}
file_for_reading.close();
//Dijkstra(matrix, 0, number_of_vertexes);

如果你只想阅读和打印,这个函数会有所帮助:

void readMatrix(int dimension, char *path, int *data)
{
FILE *file;
file = fopen(path, "r");
if (file == NULL)
{
fprintf(stderr, "error: while trying to open `%s' for readingn", path);
return; //
}
for (int i = 0 ; ((i < dimension * dimension) && (fscanf(file, "%d ", &data[i]) == 1)) ; ++i)
printf("data[%d] = %dn", i, data[i]);
fclose(file);
}

您需要定义;快速从文件中读取矩阵"对你来说意义重大

在什么计算机上,使用什么操作系统,什么硬件?

如果数据集每天编写一次,并且应用程序每天运行十几次,那么一种可能的方法是指定一些二进制格式(在一些书面文档中,受ELF规范的启发,使用EBNF表示法(,并将文本文件转换为二进制文件。

在Linux上,您可以对该二进制文件进行mmap(2(。另请参阅预读(2(和posix_fadvise(2(。在Windows上,阅读有关文件映射的信息。

如果使用C<stdio.h>函数,请注意setvbuf(3(。您希望(在2021年(拥有至少64KB的I/O缓冲区(因为页面缓存(。

如果允许的话,还可以考虑将文本文件转换为某种XDR格式。确实存在用于序列化和非序列化XDR数据的C或C++代码生成器。另请参见ASN.1

另一种方法可以是将数据集拆分为十几个较小的文本文件(例如,使用csplit(1(或您自己的等效工具(,并使用多线程方法(一个线程读取每个文件(。

第三种方法将受到汇编程序的启发:第一次只解析行尾并存储它们的文件偏移量,第二次使用几个线程来解析"行";分段";文件的。

我个人的意见是,你应该基准,而不是麻烦

使用SSD磁盘(2021年在典型的Linux桌面或服务器上(,读取文本文件中以十进制编码的一百万个整数可能需要不到一秒的CPU时间。

您还可以将这些数据转换(或存储(到一些SQLite、PostGreSQL或REDIS数据库中。