我必须导入一个大的mysql转储(最多10G).但是,已经使用具有索引定义的数据库结构预定义了sql转储.我想通过删除索引和表定义来加速数据库插入.
这意味着我必须删除/编辑10G文本文件的前几行.在linux上执行此操作的最有效方法是什么?
需要将整个文件加载到RAM中的程序对我来说太过分了.
我正在解析一个20Gb的文件,并将符合某种条件的行输出到另一个文件,但偶尔python会同时读取2行并连接它们.
inputFileHandle = open(inputFileName, 'r')
row = 0
for line in inputFileHandle:
row = row + 1
if line_meets_condition:
outputFileHandle.write(line)
else:
lstIgnoredRows.append(row)
Run Code Online (Sandbox Code Playgroud)
我检查了源文件中的行结尾,并将它们检出为换行符(ascii char 10).拉出问题行并在隔离中解析它们按预期工作.我在这里遇到一些python限制吗?第一个异常文件中的位置大约是4GB标记.
我的目标是在OSX环境中的QT项目中使用C++解析大型csv文件.(当我说csv我的意思是tsv和其他变种1GB~5GB).
这似乎是一项简单的任务,但是当文件大小变大时,事情会变得复杂.我不想编写自己的解析器,因为许多边缘情况与解析csv文件有关.
我已经找到了各种csv处理库来处理这个工作,但解析1GB文件在我的机器上大约需要90~120秒,这是不可接受的.我现在没有对数据做任何事情,我只是为了测试目的而处理和丢弃数据.
cccsvparser是我尝试过的库之一.但唯一足够快的库是fast-cpp-csv-parser,它给出了可接受的结果:我的机器上15秒,但只有在知道文件结构时它才有效.
使用示例:fast-cpp-csv-parser
#include "csv.h"
int main(){
io::CSVReader<3> in("ram.csv");
in.read_header(io::ignore_extra_column, "vendor", "size", "speed");
std::string vendor; int size; double speed;
while(in.read_row(vendor, size, speed)){
// do stuff with the data
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我无法加载任意文件,我必须专门定义变量以匹配我的文件结构.我不知道任何允许我在运行时动态创建这些变量的方法.
我尝试过的另一种方法是逐行读取csv文件,使用fast-cpp-csv-parser, LineReader类非常快(读取整个文件大约需要7秒),然后使用可以处理字符串的cccsvparser lib 解析每一行.但这需要大约40秒才能完成,与第一次尝试相比这是一个改进,但仍然是不可接受的.
我已经看到了与csv文件解析相关的各种stackoverflow问题,它们都没有将大文件处理到帐户中.
此外,我花了很多时间谷歌搜索找到这个问题的解决方案,我真的很想念包裹经理喜欢npm或pip在搜索开箱即用的解决方案时提供的自由.
我将不胜感激任何有关如何处理此问题的建议.
编辑:
当使用@fbucek的方法时,处理时间减少到25秒,这是一个很大的改进.
我们可以进一步优化这个吗?
我有一个django应用程序,允许用户上传视频.它托管在Heroku上,以及存储在S3 Bucket上的上传文件.在从Django app获得预先签名的请求后,我使用JavaScript直接将文件上传到S3.这是由于Heroku 30s请求超时.无论如何,我可以通过Django后端上传大文件而不使用JavaScript并破坏用户体验吗?
是否有可以处理大于可用RAM的文件的分布式版本控制系统(git,bazaar,mercurial,darcs等)?
我需要能够提交大型二进制文件(即数据集,源视频/图像,存档),但我不需要能够区分它们,只需提交然后在文件更改时进行更新.
我大约一年前看过这个,没有一个明显的候选人允许这个,因为它们都是为了速度而在记忆中进行区分.这给我留下了一个VCS来管理代码和其他东西("资产管理"软件或只是rsync和脚本)的大文件,当两者的目录结构重叠时,这是非常难看的.
我使用G ++中的标准ftell和fseek选项进入整数溢出,但我想我错了,因为似乎ftell64和fseek64不可用.我一直在搜索,许多网站似乎使用lseek和off64_t数据类型引用,但我没有找到任何引用等于fseek的例子.我现在正在阅读的文件是16GB + CSV文件,期望至少翻倍.
没有任何外部库,实现与fseek/ftell对类似的结构最简单的方法是什么?我的应用程序现在使用4.x的标准GCC/G ++库.
考虑到磁盘上的一个非常大的文件(可能超过4GB),我想扫描这个文件并计算出特定二进制模式的发生时间.
我的想法是:
使用内存映射文件(CreateFileMap或boost mapped_file)将文件加载到虚拟内存.
对于每个100MB映射内存,创建一个线程进行扫描并计算结果.
这可行吗?有没有更好的方法呢?
更新:
内存映射文件将是一个不错的选择,通过1.6GB文件扫描可以在11s内处理.
谢谢.
我在Python中打开一个3 GB的文件来读取字符串.然后我将这些数据存储在字典中.我的下一个目标是使用这个字典构建一个图形,所以我正在密切监视内存使用情况.
在我看来,Python将整个3 GB文件加载到内存中,我无法摆脱它.我的代码看起来像这样:
with open(filename) as data:
accounts = dict()
for line in data:
username = line.split()[1]
IP = line.split()[0]
try:
accounts[username].add(IP)
except KeyError:
accounts[username] = set()
accounts[username].add(IP)
print "The accounts will be deleted from memory in 5 seconds"
time.sleep(5)
accounts.clear()
print "The accounts have been deleted from memory"
time.sleep(5)
print "End of script"
Run Code Online (Sandbox Code Playgroud)
最后一行是在那里,以便我可以监视内存使用情况.该脚本在内存中使用超过3 GB的位.清除字典可以释放大约300 MB.当脚本结束时,释放剩余的内存.
我正在使用Ubuntu,我使用"系统监视器"和终端中的"免费"命令监视内存使用情况.
我不明白的是为什么在我清除字典之后Python需要这么多内存.文件是否仍存储在内存中?如果是这样,我怎么能摆脱它呢?我的操作系统没有看到释放内存的问题吗?
编辑:我已经尝试在清除字典后强行执行gc.collect(),但无济于事.
EDIT2:我在Ubuntu 12.04.LTS上运行Python 2.7.3
EDIT3:我意识到我忘了提到一些非常重要的东西.我真正的问题不在于我的操作系统没有"取回"Python使用的内存.后来,Python似乎没有重用那个内存(它只是要求操作系统有更多的内存).
我用我的python脚本创建大文件(1GB实际上有8个).在我创建它们之后,我必须创建将使用这些文件的进程.
该脚本如下所示:
# This is more complex function, but it basically does this:
def use_file():
subprocess.call(['C:\\use_file', 'C:\\foo.txt']);
f = open( 'C:\\foo.txt', 'wb')
for i in 10000:
f.write( one_MB_chunk)
f.flush()
os.fsync( f.fileno())
f.close()
time.sleep(5) # With this line added it just works fine
t = threading.Thread( target=use_file)
t.start()
Run Code Online (Sandbox Code Playgroud)
但应用程序use_file行为foo.txt是空的.有一些奇怪的事情发生了:
C:\use_file C:\foo.txt在控制台中执行(脚本完成后),我得到正确的结果use_file()在另一个python控制台中手动执行,我得到正确的结果C:\foo.txt在open()被调用后立即在磁盘上可见,但0B在脚本结束之前一直保持大小time.sleep(5)它只是按预期开始工作(或者更确切地说是必需的)我已经发现:
os.fsync()但它似乎没有工作(从结果use_file作为是否C:\foo.txt是空的)buffering=(1<<20)(打开文件时)似乎也不起作用 …我有一个384MB的文本文件,有5000万行.每行包含2个以空格分隔的整数:键和值.该文件按键排序.我需要一种有效的方法来查找Python中大约200个键列表的值.
我目前的方法包括在下面.这需要30秒.必须有更高效的Python foo才能将其降低到最多几秒钟的合理效率.
# list contains a sorted list of the keys we need to lookup
# there is a sentinel at the end of list to simplify the code
# we use pointer to iterate through the list of keys
for line in fin:
line = map(int, line.split())
while line[0] == list[pointer].key:
list[pointer].value = line[1]
pointer += 1
while line[0] > list[pointer].key:
pointer += 1
if pointer >= len(list) - 1:
break # end of list; -1 is due …Run Code Online (Sandbox Code Playgroud)