如何从文件中快速读取矩阵
How can I quickly read a matrix from a file?
我在以下格式的文件中存储了数字:
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数据库中。
相关文章:
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中