2

在将大块数据写入文件时,我一点也不擅长。我有一个模拟,它有这样的结构

typedef struct
{
   int age;
   float height;
   float weight;
   int friends [ 250000 ];
} Person;

而我可以拥有多达25万人,每个人有25万朋友(一个集团)。显然,这是大量的数据。如果我想保存每个结构以便以后加载它们,C 中最有效的方法是什么?这是我到目前为止所考虑的

  1. 我不想用 250,000 组数据创建一个巨大的字符串,然后再做一个write,因为这会占用大量内存
  2. 我也不想创建 250,000 个不同的文件,因为这样做可能会很慢。
  3. 根据索引附加文件(即第 1 个人,然后第 2 个人...),但这也可能很慢。
  4. 将数据保存为二进制(这样更有效吗?)

编辑我正在寻找有效的使用方法fwrite (),即收集所有数据并写入单个文件是否更快,或者是否创建多个文件并避免事先收集所有数据的开销。

4

4 回答 4

1

你可以遍历这些人,只存储年龄、身高和体重成员(3 个 fwrite),然后是一个friend_count,然后遍历这些朋友并一一写入。所有这一切都与 fwrite。您不需要关心优化 I/O,因为 C 库会为您缓冲并在需要时进行大量“写入”。

于 2012-07-05T17:28:15.777 回答
0

我认为您正在尝试 [部分] 重新发明 RDBMS(数据库)。重新发明通常是一个坏主意。考虑将您的数据存储在免费的数据库系统(例如 Postgres)中。它还有其他好处——您将能够在不编写 C 代码的情况下查询您的数据。
如果数据库听起来有点过头,请使用更简单的基于文件的数据库存储库,例如 BerkleyDB 或 SQLite。

于 2012-07-05T17:27:41.707 回答
0

我不是很清楚你的结构。

你有一个 Person 结构数组,而 friends[] 包含其他 Persons 数组的索引?

最好的方法是区分一个人和他的朋友。

这样你就有了一个固定大小的 Person,并且可以将所有 Person 存储在一个文件中,并快速读回 Person 12345 的数据 - 它位于文件开头的 filepos 12345*sizeof(Person) 处。

朋友数组可以通过一个保存在内存中

int *Friends[MAXFRIENDS]

数组——你需要 MAXFRIENDS*sizeof(int *) 更多字节的内存,对于 250.000 个朋友,在 64 位系统上应该是 2 兆字节。小变化。每个指针都保存该人的friend[] 数组。

然后 Person 的朋友进入目录中的文件,例如 /dd/cc/aabbccdd,其中 aabbccdd 由 sprintf("%08x", PersonIndex) 获得。使用 dd/cc 会导致更平衡的树。要编写朋友文件,只需指向 Friends[PersonIndex] 并根据需要编写尽可能多的朋友索引(我会将 FriendsNumber 存储在 Person 结构中)。

于 2012-07-05T17:39:18.670 回答
0

我会看一个像HDF5这样的库,这样您不仅可以在这台机器上读回文件,还可以将文件提供给其他人,并为您解决平台可移植性问题。

于 2012-07-05T18:08:14.107 回答