fopen当我尝试读取一个非常适中的文件时失败了PHP. A 6 meg file让它窒息,虽然周围的小文件100k很好.我读过,有时需要重新编译PHP与-D_FILE_OFFSET_BITS=64以读取在20场演出什么可笑的文件标记,但我不应该有一个6兆的文件没有问题?最终我们想要读取大约100兆的文件,并且能够打开它们然后逐行读取它们将很好,因为我可以使用较小的文件.
您在非常大的文件上阅读和操作的技巧/解决方案是什么PHP?
更新:这是一个在我的6 meg文件上失败的简单代码块的示例 - PHP似乎没有抛出错误,它只返回false.也许我正在做一些非常愚蠢的事情?
$rawfile = "mediumfile.csv";
if($file = fopen($rawfile, "r")){
fclose($file);
} else {
echo "fail!";
}
Run Code Online (Sandbox Code Playgroud)
另一个更新:感谢大家的帮助,它确实是一个令人难以置信的愚蠢 - 权限问题.当较大的文件没有时,我的小文件莫名其妙地具有读权限.卫生署!
我在带有1GB RAM的Mac Mini上使用Python 2.6.我想读一个巨大的文本文件
$ ls -l links.csv; file links.csv; tail links.csv
-rw-r--r-- 1 user user 469904280 30 Nov 22:42 links.csv
links.csv: ASCII text, with CRLF line terminators
4757187,59883
4757187,99822
4757187,66546
4757187,638452
4757187,4627959
4757187,312826
4757187,6143
4757187,6141
4757187,3081726
4757187,58197
Run Code Online (Sandbox Code Playgroud)
因此文件中的每一行都包含两个以逗号分隔的整数值的元组.我想读取整个文件并根据第二列对其进行排序.我知道,我可以在不将整个文件读入内存的情况下进行排序.但我认为对于一个500MB的文件,我仍然可以在内存中进行,因为我有1GB可用.
但是当我尝试读取文件时,Python似乎分配的内存比磁盘上的文件所需的内存多得多.因此,即使使用1GB的RAM,我也无法将500MB的文件读入内存.我用于读取文件和打印有关内存消耗的信息的Python代码是:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
infile=open("links.csv", "r")
edges=[]
count=0
#count the total number of lines in the file
for line in infile:
count=count+1
total=count
print "Total number of lines: ",total
infile.seek(0)
count=0
for line in infile:
edge=tuple(map(int,line.strip().split(","))) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用WebSocket API上传大文件(至少500MB,最好是几GB).问题是我无法弄清楚如何编写"发送此文件的片段,释放使用的资源然后重复".我希望我可以避免使用像Flash/Silverlight这样的东西.
目前,我正在开展以下工作:
function FileSlicer(file) {
// randomly picked 1MB slices,
// I don't think this size is important for this experiment
this.sliceSize = 1024*1024;
this.slices = Math.ceil(file.size / this.sliceSize);
this.currentSlice = 0;
this.getNextSlice = function() {
var start = this.currentSlice * this.sliceSize;
var end = Math.min((this.currentSlice+1) * this.sliceSize, file.size);
++this.currentSlice;
return file.slice(start, end);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我会上传使用:
function Uploader(url, file) {
var fs = new FileSlicer(file);
var socket = new WebSocket(url);
socket.onopen = function() {
for(var i = 0; i …Run Code Online (Sandbox Code Playgroud) 我需要在C#控制台应用程序中通过HTTP 下载大文件(2 GB).问题是,在大约1.2 GB之后,应用程序内存不足.
这是我正在使用的代码:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential(username, password);
byte[] fileData = request.DownloadData(baseURL + fName);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的......我正在将文件直接读入内存.我很确定如果我要从块中读取数据并将其写入磁盘上的文件,我可以解决这个问题.
我怎么能这样做?
我需要获得大小超过2 GB的文件的文件大小.(在4.6 GB文件上测试).没有外部程序有没有办法做到这一点?
当前状态:
filesize(),stat()并fseek()失败fread()和feof()工作通过读取文件内容可以获得文件大小(非常慢!).
$size = (float) 0;
$chunksize = 1024 * 1024;
while (!feof($fp)) {
fread($fp, $chunksize);
$size += (float) $chunksize;
}
return $size;
Run Code Online (Sandbox Code Playgroud)
我知道如何在64位平台上使用它(使用fseek($fp, 0, SEEK_END)和ftell()),但我需要32位平台的解决方案.
解决方案:我已经为此启动了开源项目.
Big File Tools是在PHP中操作超过2 GB的文件所需的hacks集合(即使在32位系统上).
我有一个1500万行的文件(不适合内存).我还有一个小的行号矢量 - 我要提取的行.
如何一次性读出线条?
我希望有一个C函数可以一次完成它.
我有一个190 MB纯文本文件,我想在github上跟踪.
文本文件是我们的文本到语音引擎的代词词典文件.我们经常在文本文件中添加和修改行,并且差异相当小,因此在这个意义上它非常适合git.
但是,GitHub具有严格的100 MB文件大小限制.我已经尝试过GitHub大文件存储服务,但每次更改时都会上传整个190 MB文件的新版本 - 因此,如果我沿着这条路走下去,那么它将迅速增长到几千兆字节.
我想将文件保存为一个文件而不是拆分它,因为这是我们的工作流程当前的方式,并且需要一些编码才能允许多个文本文件作为我们工具中的输入/输出(并且我们没有太多的开发资源) .
我有一个想法是,也许可以设置一些预提交和提交后挂钩来自动拆分和连接大文件?这可能吗?
其他想法?
编辑:我知道StackOverflow上类似问题中描述的100 MB文件大小限制,但我不认为我的问题是重复的,因为我要求的是差异很小且频繁的特定情况(我'我没有尝试上传大型ZIP文件或任何东西).但是,我的理解是git-lfs仅适用于很少更改的文件,而普通的git非常适合我所描述的那种文件; 除了GitHub有文件大小限制.
更新:我昨天花了一些时间尝试创建一个小型跨平台程序,该程序使用git hooks将文件拆分并连接成较小的文件.它有点工作但不太令人满意.您需要将.gitignore排除大文本文件,这使得git不知道它是否已更改.拆分文件最初没有检测到git status或git commit导致与此SO问题中描述的相同问题,这非常烦人:预提交脚本创建mysqldump文件,但"没有提交(工作目录清理)"?
设置一个cron作业(linux)和计划任务(windows)以定期自动重新生成拆分文件可能会解决这个问题,但是自动设置并不容易,可能会导致用户计算机出现性能问题,而且不是很优雅解.可能还需要一些像动态修改.gitignore这样的hacky解决方案,并且绝不会得到实际文本文件的差异,只有分割文件(尽管这可能是可接受的,因为它们非常相似).
所以,睡着了,今天我觉得git hook方法毕竟不是一个好选择,因为它有太多的怪癖.正如@PyRulez所建议的那样,我想我不得不看看除GitHub之外的其他服务(不幸的是,因为我喜欢github).托管解决方案更可取,以避免必须管理我们自己的服务器.我也希望它能公开上市......
更新2:我已经看了一些GitHub的替代品,目前我倾向于使用GitLab.我已经联系了GitHub关于提高100MB限制的可能性的支持,但如果他们不这样做,我将只为这个特定项目切换到GitLab.
我正在使用Erica Sadun的异步下载方法(此处链接到项目文件:下载),但是她的方法不适用于具有大尺寸(50 mb或更高)的文件.如果我尝试下载超过50 MB的文件,它通常会因内存崩溃而崩溃.无论如何我可以调整这段代码,以便它也适用于大文件?这是我在DownloadHelper类中的代码(已经在下载链接中):
.H
@protocol DownloadHelperDelegate <NSObject>
@optional
- (void) didReceiveData: (NSData *) theData;
- (void) didReceiveFilename: (NSString *) aName;
- (void) dataDownloadFailed: (NSString *) reason;
- (void) dataDownloadAtPercent: (NSNumber *) aPercent;
@end
@interface DownloadHelper : NSObject
{
NSURLResponse *response;
NSMutableData *data;
NSString *urlString;
NSURLConnection *urlconnection;
id <DownloadHelperDelegate> delegate;
BOOL isDownloading;
}
@property (retain) NSURLResponse *response;
@property (retain) NSURLConnection *urlconnection;
@property (retain) NSMutableData *data;
@property (retain) NSString *urlString;
@property (retain) id delegate;
@property (assign) BOOL isDownloading;
+ …Run Code Online (Sandbox Code Playgroud) 我正在尝试处理稍大(可能高达200M)的JSON文件.该文件的结构基本上是一个对象数组.
所以有些东西:
[
{"property":"value", "property2":"value2"},
{"prop":"val"},
...
{"foo":"bar"}
]
Run Code Online (Sandbox Code Playgroud)
每个对象都具有任意属性,并且不必与数组中的其他对象共享它们(如同,具有相同).
我想对数组中的每个对象应用处理,因为文件可能很大,我不能在内存中啜饮整个文件内容,解码JSON并迭代PHP数组.
理想情况下,我想阅读文件,获取每个对象的足够信息并进行处理.如果有类似的库可用于JSON,那么SAX类型的方法就可以了.
关于如何最好地处理这个问题的任何建议?
我正在尝试加载一个填充了JSON字符串的大文件(大小为2GB),由换行符分隔.例如:
{
"key11": value11,
"key12": value12,
}
{
"key21": value21,
"key22": value22,
}
…
Run Code Online (Sandbox Code Playgroud)
我现在导入它的方式是:
content = open(file_path, "r").read()
j_content = json.loads("[" + content.replace("}\n{", "},\n{") + "]")
Run Code Online (Sandbox Code Playgroud)
这似乎是一个黑客(在每个JSON字符串之间添加逗号以及开始和结束方括号以使其成为正确的列表).
有没有更好的方法来指定JSON分隔符(换行符\n而不是逗号,)?
而且,Python似乎无法为从2GB数据构建的对象正确分配内存,有没有办法构建每个JSON对象,因为我正在逐行读取文件?谢谢!