【发布时间】:2013-05-24 16:30:39
【问题描述】:
我正在使用 php (1GB+) 中的大型文本文件,我正在使用
file_get_contents("file.txt", NULL, NULL, 100000000,100);
要从文件中间获取数据,但如果我想将文件中的数据更改为与原始数据不同的更改,我将不得不重写整个文件。
如果数据大于原始数据,如何在不覆盖数据的情况下更改文件中的数据(可变长度)?我保留文件中不同数据块的索引及其字节位置。似乎唯一的选择是将x个字节数专用于每条数据,然后如果我想更改它则重写该块......问题在于它会占用比需要更多的空间空字节,写入需要更长的时间......这仍然无法解决如何“删除”数据,因为文件永远不会缩小大小......我真的需要一些帮助......
如果我为文件中的每条数据使用前缀块,比如 1 mb,那么我想输入的数据只有 100kb,该条目将占用 10 倍实际需要的空间,并且该条目永远无法更改到超过 1mb 的数据,因为它会覆盖超过第一个专用块......删除它是不可能的......希望这有任何意义......我不是在寻找替代品,我正在寻找修改文件中间的数据,嘿嘿……
更新:是的,我想替换旧数据,但如果新数据比旧数据扩展更多,我希望将其余数据进一步推入文件中......
考虑一下:0000000HELLODATA00000000 零代表空白空间,什么都没有......现在我想用一些东西代替你好,现在因为东西比你好,简单地写在你好的起点会延伸到你好并开始覆盖数据......所以我会像 DATA 被进一步推入文件,为某些东西腾出空间而不覆盖 DATA...呵呵
【问题讨论】:
-
fopen()、fseek() 和 fwrite() 浮现在脑海中……如果您知道文件中正在读取数据的位置,您也可以使用它而不是将完整文件加载到记忆
-
您可以使用数据库代替文本文件。另一种方法是混合使用数据库和文本文件。将大文件分成几部分,从数据库中获取部分信息。具体实现取决于需求。
-
Ftuncate 调整文件大小然后移动数据以腾出空间stackoverflow.com/a/10467726/778719
-
您可以将文件的内容读取到字符串中,然后使用 strlen() 来查找字符串的长度。现在您可以通过在中间添加文本来轻松找到字符串的中间形成一个新字符串。
-
简短的回答:使用数据库。它专为基于现场的存储而设计。这正是你试图重新发明的声音。