C#以文件系统(二进制)形式保存数据

nini7809 2010-09-08 11:32:22
RT.

有哪位兄弟做过类似项目?
就是以文件系统代替关系数据库。

GOOGLE了很久都没有价值的东东来,可能是关键字不对。

请有过经验的朋友指点一下,
现在我想要写个小工具,就是对文件系统和数据库的数据操作性能做一个详细的对比。

需要在不同操作系统下,因为C++和JAVA不擅长,所以就先决定用C#实现了。

...全文
593 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xie_xingan 2010-09-13
  • 打赏
  • 举报
回复
我想你可能希望找的是一个轻量级的数据库,有几个小型的数据库,也可以叫做文件型的数据库,这类数据库并不像SqlServer, MySql一样需要后台服务,它们只需要用文件+DLL就可以调用。
1. Sqlite
Firefox就是用的这个。
http://www.sqlite.org/
2. Sql Server Compact
Visual Stuido 用的这个
3. Postgre
nini7809 2010-09-13
  • 打赏
  • 举报
回复
继续!
nini7809 2010-09-10
  • 打赏
  • 举报
回复
继续顶~
andy1118 2010-09-09
  • 打赏
  • 举报
回复
向高手学习

顶上去
bluedoctor 2010-09-09
  • 打赏
  • 举报
回复
自己定一个数据结构,也就是字段的长度和类型结构,以前的VB就直接支持把结构保存到随机文件中,需要的时候按照“记录号”查找并更新即可。
也可以使用序列化方式,将对象序列化,比如序列化成JSON格式,存储效率很高的。我们做了一个系统就是这样的搞的,没有使用任何数据库,把对象序列化成文件来访问。
快乐大法师 2010-09-09
  • 打赏
  • 举报
回复
查查 序列化吧 二进制的 可能有用
nini7809 2010-09-09
  • 打赏
  • 举报
回复
终-->重
nini7809 2010-09-09
  • 打赏
  • 举报
回复
请sp1234这位老兄多多指点~

我现在没什么头绪
我应该先详细了解什么叫文件系统么?
这里的文件系统与磁盘的逻辑分区文件系统有什么关联呢?
在尝试以文件系统存储数据时,最终要的是不是文件系统的结构设计呢?
这些设计我又该去了解些什么资料?
nini7809 2010-09-09
  • 打赏
  • 举报
回复
谢谢大虾的指点,受教了!

事件是起源是这样的:
现在需要做一个课题的预研,要面对日均5000万的数据处理,在同等硬件条件下,是采用文件系统还是采用数据库的好。不知道金融电信等行业是如何处理的,当然是需要一些明确的性能数字来说明的。

以前对文件系统的存储几乎没什么了解,找资料又似乎没什么头绪。所以前来求解惑之道了。


nini7809 2010-09-09
  • 打赏
  • 举报
回复
LS的头像真有勇气~
mjp1234airen4385 2010-09-09
  • 打赏
  • 举报
回复
每天5000万的数据量,你还使用自己编写的文件系统。
你可真有勇气。
如果你把自己开发的这套千万级/天的系统做好了,能当数据库买了。
上海程序员3 2010-09-08
  • 打赏
  • 举报
回复
FileStrem 用文件流,不过我也弄了自己的数据库(或是文件系统),我没有用文件流,直接写文本文件。
  • 打赏
  • 举报
回复
拿第一个来说吧,这就根本不是什么在文件末尾增加数据记录、每当删除记录都重建整个文件的浅显思路可以解决的:

文件系统要高效地读取数据,那么最基本地就是尽量每一次读取数据块的大小都是底层磁盘块的整数倍。例如数据库系统会把8k、16k之类的作为一个磁盘数据块,然后把多条记录放在一个数据库内,而记录并不跨多个数据块。当保存新记录时,首先要去查询一下空闲数据块队列。当删除记录时,它就有可能使得数据块编程空闲的。一定数目的数据块被高速缓存。这相当于数据库管理系统在基本磁盘文件系统之上又创建了一套磁盘文件操作系统,同时由于有这一层机制存在,当底层存储器改变时只要选择不同的适配程序重新编译一下,而其它层并不改变。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nini7809 的回复:]
其实像ORACLE、MSSQL、DB2这样的数据库最终都是以文件系统的形式存储数据的,只是在上面加了一层关系,所以就成了关系数据库?

而现在要研究的文件系统就是抛开中间的关系数据库,直接对二进制文件(系统)进行读写?
[/Quote]
你写一个管理系统,实现了这个功能,你自己不是就做了一个关系数据库了嘛!

所以你的说法我觉得特逗,跟现在很多小孩子一样,动不动就时髦的名词“不用xxxxx,直接xxxxx”,可是你如果做出来真东西,不就是模仿人家你不屑于用的东西了嘛?!还有什么新鲜的想法?
  • 打赏
  • 举报
回复
google了很久什么?不是什么都用google来“解决的”,如果你没有别人告诉你该google什么,自己可能会自欺欺人。

什么叫做数据库?给你个基本知识,这是任何一个正规学软件的人应该在《数据库原理和设计》(注意不是皮毛式的使用数据库,而是学习开发数据库)课程都会学到:

1. 它可以合理地将数据组织到磁盘块中。
2. 它知道如何进行b+树之类的索引。
3. 它支持sql语句或者类似的其它嵌入编程工具的高效工具,并且自动高效地编译查询语句。
4. 它懂得支持事务处理,不懂事务处理的内部机制还叫做会进行数据库编程?
5. 它支持大规模多用户或者同一进程中的多线程的并发访问数据库,通常可以基于记录级别维护锁(而不是基于表)。
6. 它支持自动维护ID、外键级联操作等等机制。
7. 支持以命名管道、tcp、http等方式,以SQL、xml等等多种客户端访问方式。
8. 支持触发器或者类似的编程机制。

等等。


当你不需要数据库时,可以使用文件系统。但是小心把事情夸大得满拧了,说“代替”二字还是要谨慎一点。
nini7809 2010-09-08
  • 打赏
  • 举报
回复
真对不起,我好像研究方向有点搞错了... ...
事实上用C#实现对二进制文件的读写应该是不难,刚找到一篇文章。
http://maidini.blog.163.com/blog/static/377627042009112115421461/

我们现在研究的方向是文件系统与数据库的性能对比。
文件系统这个东东到底是什么呢?是不是要自己定义文件结构呢?其中的索引设计是不是很重要呢?
我的理解是,其实像ORACLE、MSSQL、DB2这样的数据库最终都是以文件系统的形式存储数据的,只是在上面加了一层关系,所以就成了关系数据库?

而现在要研究的文件系统就是抛开中间的关系数据库,直接对二进制文件(系统)进行读写?

有点没有头绪,请大虾指点... ...
还有,我是不是问错板块了?
ShinNakoruru 2010-09-08
  • 打赏
  • 举报
回复
我有类似的。
给你个小例子。

定义


interface IDataPacket
{
byte[] Pack();
void Unpack(byte[] buffer);
}

//所有实体继承于IDataPacket。
//假设

public class User : IDataPacket
{
public int UserId {get;set;}
public string UserName {get;set;}

public byte[] Pack()
{
byte[] ret=null;

using(System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
using(BinaryWriter wtr=new BinaryWriter(ms))
{
wtr.Write(UserId);
wtr.Write(UserName);
}
ms.Flush();
ret = ms.ToArray();
}

return ret;
}

public void Unpack(byte[] buffer)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer))
{
using (BinaryReader rdr = new BinaryReader(ms))
{
UserId = rdr.ReadInt32();
UserName = rdr.ReadString();
}
}
}
}


实体值写入文件系统只需要FileStream.Write(User.Pack()),而读取数据只需要Read出对应长度的byte[]
调用User.Unpack()。
当然你还需要在数据包中定义字节流长度以便读取。
事实上我上面的例子是我用来写自定义网络通讯协议的。
nini7809 2010-09-08
  • 打赏
  • 举报
回复
大型系统,商用数据,用文本文件肯定不合适。
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧