需要一种快速的方法来将大块数据写入C中的文件

时间:2012-07-05 17:22:22

标签: c file

在将大块数据写入文件时,我并不是很好。我有一个类似结构的模拟

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. 将数据保存为二进制(这样效率更高吗?)

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我对你的结构不是很清楚。

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

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

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

Friends数组可以通过

保存在内存中
int *Friends[MAXFRIENDS]

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

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

答案 3 :(得分:0)

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