- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我成功读取了这样的 CSV 文件(CSV 文件有 4 列 x,y,u,v)-
while(4 == fscanf(fp, "%f %f %f %f\n", &d.xvalue, &d.yvalue, &d.uvalue, &d.vvalue))
{
dataset = realloc(dataset, sizeof(*dataset) * (total + 1));
dataset[total] = d;
total++;
}
结构体-
typedef struct {
double xvalue;
double yvalue;
double uvalue;
double vvalue;
} flow_data;
但是对于大型 CSV 文件,它会执行超过 100,000 次的重新分配。我试图将其简化为类似这样的内容,但现在根本无法阅读。
// Reading flow_data.csv
FILE* fp = fopen(flow_file, "r");
// Checking if the file has been read succesfully
if( fp == NULL)
{
perror("Error opening file");
exit(1);
}
char buf[500];
fgets(buf, sizeof(buf), fp); // Skip the first line
int total = 0;
int buf_size = INITIAL_SIZE;
flow_data d;
flow_data* dataset = (flow_data*)malloc(sizeof(flow_data) * buf_size);
while(4 == fscanf(fp, "%lf, %lf, %lf, %lf\n", &d.xvalue, &d.yvalue, &d.uvalue, &d.vvalue))
{
if (d.xvalue >= 0)
{
if (total >= buf_size) {
buf_size = buf_size * 2;
dataset = realloc(dataset,buf_size * sizeof(flow_data));
if (dataset == NULL) {
printf("error allocating memory!\n");
exit(EXIT_FAILURE);
}
}
dataset[total] = d;
total++;
}
}
只有当 X 值大于 20 时才读取该行。我做错了什么?
最佳答案
下面是大小加倍代码的实现,其中测试了 d.xvalue >= 20
条件:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
double xvalue;
double yvalue;
double uvalue;
double vvalue;
} flow_data;
static void print_dataset(size_t size, flow_data dataset[size]);
int main(void)
{
char flow_file[] = "flow_data.csv";
FILE *fp = fopen(flow_file, "r");
if (fp == NULL)
{
perror(flow_file);
exit(1);
}
char buf[500];
fgets(buf, sizeof(buf), fp); // Skip the first line
size_t total = 0;
size_t buf_size = 0;
flow_data *dataset = NULL;
flow_data d;
while (4 == fscanf(fp, "%lf, %lf, %lf, %lf\n", &d.xvalue, &d.yvalue, &d.uvalue, &d.vvalue))
{
if (d.xvalue >= 20)
{
if (total >= buf_size)
{
size_t new_size = buf_size * 2 + 2;
flow_data *new_data = realloc(dataset, new_size * sizeof(flow_data));
if (new_data == NULL)
{
printf("error allocating memory!\n");
free(dataset);
exit(EXIT_FAILURE);
}
dataset = new_data;
buf_size = new_size;
}
dataset[total++] = d;
}
}
/* Very unlikely to fail */
dataset = realloc(dataset, total * sizeof(flow_data));
print_dataset(total, dataset);
free(dataset);
fclose(fp);
return 0;
}
static void print_dataset(size_t size, flow_data dataset[size])
{
for (size_t i = 0; i < size; i++)
{
printf("[%zu]: (%f, %f) (%f, %f)\n", i,
dataset[i].xvalue, dataset[i].yvalue,
dataset[i].uvalue, dataset[i].vvalue);
}
}
给定一个这样的示例数据文件(40 行):
22.3,22.3,25.3,24.8
26.5,25.3,21.5,11.5
17.5,12.6,12.8,17.6
17.2,28.5,17.0,23.7
29.6,29.1,28.5,14.2
20.1,15.5,21.5,16.4
26.9,29.0,25.6,13.1
16.7,29.0,26.7,16.4
22.8,14.7,17.4,12.5
27.2,13.8,26.6,25.0
26.7,13.1,26.2,19.3
20.8,25.3,28.8,10.6
27.0,27.0,16.7,10.4
18.4,23.3,16.9,25.9
27.7,17.3,29.2,26.8
14.2,27.6,16.2,10.1
21.7,11.4,21.2,12.6
20.6,12.4,25.5,15.5
29.0,11.4,12.1,18.1
25.7,22.3,24.4,12.9
10.6,22.1,25.6,18.7
25.5,25.1,25.0,29.7
27.3,11.4,16.1,11.3
14.7,11.1,24.0,15.1
29.7,12.1,11.1,22.5
10.5,13.7,22.6,22.6
25.1,16.3,21.2,13.8
17.1,11.5,12.0,24.6
17.5,24.1,19.3,24.8
12.5,29.8,19.7,10.6
11.2,19.6,17.8,24.5
22.4,12.9,10.3,25.8
17.7,10.1,27.9,21.4
18.5,11.7,16.5,24.5
17.0,26.0,20.2,29.6
20.1,11.8,22.3,20.7
25.1,14.1,25.3,13.5
22.6,14.1,26.4,16.2
13.0,29.2,14.7,19.6
17.3,12.6,28.2,15.1
它产生输出:
[0]: (26.500000, 25.300000) (21.500000, 11.500000)
[1]: (29.600000, 29.100000) (28.500000, 14.200000)
[2]: (20.100000, 15.500000) (21.500000, 16.400000)
[3]: (26.900000, 29.000000) (25.600000, 13.100000)
[4]: (22.800000, 14.700000) (17.400000, 12.500000)
[5]: (27.200000, 13.800000) (26.600000, 25.000000)
[6]: (26.700000, 13.100000) (26.200000, 19.300000)
[7]: (20.800000, 25.300000) (28.800000, 10.600000)
[8]: (27.000000, 27.000000) (16.700000, 10.400000)
[9]: (27.700000, 17.300000) (29.200000, 26.800000)
[10]: (21.700000, 11.400000) (21.200000, 12.600000)
[11]: (20.600000, 12.400000) (25.500000, 15.500000)
[12]: (29.000000, 11.400000) (12.100000, 18.100000)
[13]: (25.700000, 22.300000) (24.400000, 12.900000)
[14]: (25.500000, 25.100000) (25.000000, 29.700000)
[15]: (27.300000, 11.400000) (16.100000, 11.300000)
[16]: (29.700000, 12.100000) (11.100000, 22.500000)
[17]: (25.100000, 16.300000) (21.200000, 13.800000)
[18]: (22.400000, 12.900000) (10.300000, 25.800000)
[19]: (20.100000, 11.800000) (22.300000, 20.700000)
[20]: (25.100000, 14.100000) (25.300000, 13.500000)
[21]: (22.600000, 14.100000) (26.400000, 16.200000)
它在 Valgrind 下干净地运行在运行带有 GCC 8.2.0 和 Valgrind 3.14.0.GIT 的 macOS 10.13.6 High Sierra 的 Mac 上进行测试(从 Git 存储库的副本而非正式版本构建的 Valgrind 版本)。
==76412== HEAP SUMMARY:
==76412== in use at exit: 23,135 bytes in 168 blocks
==76412== total heap usage: 195 allocs, 27 frees, 99,487 bytes allocated
==76412==
==76412== LEAK SUMMARY:
==76412== definitely lost: 0 bytes in 0 blocks
==76412== indirectly lost: 0 bytes in 0 blocks
==76412== possibly lost: 0 bytes in 0 blocks
==76412== still reachable: 0 bytes in 0 blocks
==76412== suppressed: 23,135 bytes in 168 blocks
关于c - 读取 CSV 文件 - 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52142905/
我在具有 2CPU 和 3.75GB 内存 (https://aws.amazon.com/ec2/instance-types/) 的 c3.large Amazon EC2 ubuntu 机器上运
我想通过用户空间中的mmap-ing并将地址发送到内核空间从用户空间写入VGA内存(视频内存,而不是缓冲区),我将使用pfn remap将这些mmap-ed地址映射到vga内存(我将通过 lspci
在 Mathematica 中,如果你想让一个函数记住它的值,它在语法上是很轻松的。例如,这是标准示例 - 斐波那契: fib[1] = 1 fib[2] = 1 fib[n_]:= fib[n] =
我读到动态内存是在运行时在堆上分配的,而静态内存是在编译时在堆栈上分配的,因为编译器知道在编译时必须分配多少内存。 考虑以下代码: int n; cin>>n; int a[n]; 如果仅在运行期间读
我是 Python 的新手,但我之前还不知道这一点。我在 for 循环中有一个基本程序,它从站点请求数据并将其保存到文本文件但是当我检查我的任务管理器时,我发现内存使用量只增加了?长时间运行时,这对我
我正在设计一组数学函数并在 CPU 和 GPU(使用 CUDA)版本中实现它们。 其中一些函数基于查找表。大多数表占用 4KB,其中一些占用更多。基于查找表的函数接受一个输入,选择查找表的一两个条目,
读入一个文件,内存被动态分配给一个字符串,文件内容将被放置在这里。这是在函数内部完成的,字符串作为 char **str 传递。 使用 gdb 我发现在行 **(str+i) = fgetc(aFil
我需要证实一个理论。我正在学习 JSP/Java。 在查看了一个现有的应用程序(我没有写)之后,我注意到一些我认为导致我们的性能问题的东西。或者至少是其中的一部分。 它是这样工作的: 1)用户打开搜索
n我想使用memoization缓存某些昂贵操作的结果,这样就不会一遍又一遍地计算它们。 两个memoise和 R.cache适合我的需要。但是,我发现缓存在调用之间并不可靠。 这是一个演示我看到的问
我目前正在分析一些 javascript shell 代码。这是该脚本中的一行: function having() { memory = memory; setTimeout("F0
我有一种情况,我想一次查询数据库,然后再将整个数据缓存在内存中。 我得到了内存中 Elasticsearch 的建议,我用谷歌搜索了它是什么,以及如何在自己的 spring boot 应用程序中实现它
我正在研究 Project Euler (http://projecteuler.net/problem=14) 的第 14 题。我正在尝试使用内存功能,以便将给定数字的序列长度保存为部分结果。我正在
所以,我一直在做 Java 内存/注意力游戏作业。我还没有达到我想要的程度,它只完成了一半,但我确实让 GUI 大部分工作了......直到我尝试向我的框架添加单选按钮。我认为问题可能是因为我将 JF
我一直在尝试使用 Flask-Cache 的 memoize 功能来仅返回 statusTS() 的缓存结果,除非在另一个请求中满足特定条件,然后删除缓存。 但它并没有被删除,并且 Jinja 模板仍
我对如何使用 & 运算符来减少内存感到非常困惑。 我可以回答下面的问题吗? clase C{ function B(&$a){ $this->a = &$a; $thi
在编写代码时,我遇到了一个有趣的问题。 我有一个 PersonPOJO,其 name 作为其 String 成员之一及其 getter 和 setter class PersonPOJO { priv
在此代码中 public class Base { int length, breadth, height; Base(int l, int b, int h) { l
Definition Structure padding is the process of aligning data members of the structure in accordance
在 JavaScript Ninja 的 secret 中,作者提出了以下方案,用于在没有闭包的情况下内存函数结果。他们通过利用函数是对象这一事实并在函数上定义一个属性来存储过去调用函数的结果来实现这
我正在尝试找出 map 消耗的 RAM 量。所以,我做了以下事情;- Map cr = crPair.collectAsMap(); // 200+ entries System.out.printl
我是一名优秀的程序员,十分优秀!