基于SPI Flash的FlashFS批量创建文件和写数据测试以及相关问题
1. 每次创建10个CSV文件,分别写入32字节数据。速度测试如下:(创建前挂载,10个文件都写完后卸载)
================================================
经过测试发现,随着数据大批量的写入,首次创建文件和后面创建的9个文件需要的时间越来越长
多次创建后发现速度剧增。
只挂载一次,后面不再重复挂载和卸载,发现首次创建的时间基本跟后面9次一致了,但是随着不断的写入,
打开时间还是不断增加。估计FlashFS每次创建新文件都有一个查询的过程,随着文件数的大量增加,查询时间也长了。
fout = fopen ("re.csv", "a"); append方式坚决不可以用在SPI Flash上面,这样会造成写入耗时越来越长。
写到400次的时候,速度已经没法看了。
对同一个文件进行重复重写fout = fopen ("re.csv", "w"); 测试了1000次,速度较稳定,每次写1024字节。
打开速度还算稳定。没有进行重复的加载和卸载。
测试进行了重复的加载和卸载,跟上面的速度基本一样。
创建1000个文件,每次写64字节数据,测试结果如下,创建新文件的时间慢慢增加。
================================
重新写这1000个文件。
创建到4000个文件时,速度已经无法容忍了,每次64字节。
依次创建1000个文件,每次写数据1024字节,然后循环重写9次,一共是执行了10000次。
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2. 创建的文件不要太多,最好不要超过1000个文件。文件越多访问速度也越慢。
3. 实际测试按照一页的倍数(256字节)进行写操作最好,这样基本没有文件碎片。
4. 不管创建的是多少文件,如果采用的是重复写已经创建的文件,打开文件的速度会一点点增加,
最终趋于一个最大值,后基本不会再增加,而是变成小值后继续增加,如此循环,实际测试是这样的。
5. 挂载系统后,首次创建或者打开文件比较的耗时间,这点要注意。
6. 真正耗时间的不是读写文件耗时间,而是创建或者打开文件比较的耗时间。
=============================================================
a. 这么来说的话,实际使用SPI Flash的FlashFS时最好采用创建多个文件来做数据管理,但是创建
的文件数最好不要太多,要不会造成访问速度极其慢。
b. 可以考虑删除文件然后重新创建文件进行数据记录,这样速度要快些。
另外就是在文件打开的情况下,进行数据读写操作,记录了多条数据后再进行关闭文件,要不重新打开
文件比较耗时间。只有关闭了文件,写的数据才会记录到SPI Flash里面。 实际测试还有一种非常实用的方法,而且很适合基于SPI Flash的FlashFS,可以挂载了文件系统以后,创建文件,创建后不要再关闭这个文件,然后使用
fwrite等函数写数据,写一次数据调用一次fflush即可。这样就不需要重复打开和关闭文件了,而且也不怕掉电问题。 finit初始化文件系统时,会有检索整个文件系统fat和fsinfo的过程,导致运行巨慢。。。
估计打开文件时也有这种问题,你可以跟踪到反汇编里面,看看到底是哪个代码段耗费了这么多时间
我就是这样发现finit的问题的 我在使用中还发现,随着文件的不断变大,搜索文件函数ffind时间也越来越长。
回 zhou_jinbao 的帖子
zhou_jinbao:我在使用中还发现,随着文件的不断变大,搜索文件函数ffind时间也越来越长。 (2015-10-23 09:14) images/back.gif这个应该是他内部机制决定的,我现在的办法就是打开一个文件后不要关闭,通过函数
fwrite后,再fflush同步一下,这样数据就写入到SPI Flash,速度也很稳定了。
创建文件太多比较影响速度。 我手上做的一个项目想要使用FLASHFS,问题是写入的数据量一大,文件系统就会莫名其妙的损坏,掉电后再上电,fcheck通不过,必须要重新格式化才行,百思不得解啊!!
我用的单片机是LPC1343,FLASH是W25X32;
高手可知道是啥原因?
ps: 不用FLASHFS, 直接操作FLASH 没有问题.
回 stillman 的帖子
stillman:我手上做的一个项目想要使用FLASHFS,问题是写入的数据量一大,文件系统就会莫名其妙的损坏,掉电后再上电,fcheck通不过,必须要重新格式化才行,百思不得解啊!!我用的单片机是LPC1343,FLASH是W25X32;
高手可知道是啥原因?
ps: 不用FLASHFS, 直接操作FLASH 没有 .. (2017-07-18 18:54) images/back.gif
损坏倒是没有遇到过,主要是这个帖子里面说的速度慢的问题。 请问,如果需要对同一个文件重复写入数据,不采用fopen (xxxxx, “a”)模式,可以怎么处理呢? 1604-9527 发表于 2018-9-6 17:06
请问,如果需要对同一个文件重复写入数据,不采用fopen (xxxxx, “a”)模式,可以怎么处理呢?
这样的话,最好可以记录一批数据后,创建个新的文件继续。 eric2013 发表于 2018-9-7 01:11
这样的话,最好可以记录一批数据后,创建个新的文件继续。
感谢你的回复:handshake。
现在做的硬件是SPI FLASH,上位机把很多个 APP分段下发给设备,在设备上能手动选择app来更新。如果采用创建新的文件的方法,一个APP就需要很多个文件来保存数据了,感觉实用会不太方便。 1604-9527 发表于 2018-9-7 20:32
感谢你的回复。
现在做的硬件是SPI FLASH,上位机把很多个 APP分段下发给设备,在设备上能手动 ...
下发APP应该问题不大,可以实际测试下性能。 eric2013 发表于 2015-9-15 23:59
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2....
硬汉哥,我现在也遇到文件重复以“w”模式打开次数多了后,打开速度变慢的现象。但是文件是保存参数用的,当参数变化后,只能以"w"模式打开文件重写,目前不太好变更文件名。有什么办法能改善这种情况吗? zhumx 发表于 2023-12-26 08:52
硬汉哥,我现在也遇到文件重复以“w”模式打开次数多了后,打开速度变慢的现象。但是文件是保存参数用的 ...
不要求速度的话,就慢慢写即可。也可以整体缓冲些后写入。 eric2013 发表于 2015-9-15 23:59
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2....
“1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。”这句话是不是打错了,是不可以使用fopen (xxxxx, "a")模式“?
页:
[1]