mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中
我正在使用50 Gb MySQL導出文件,并對其執行腳本操作列表以轉換為SQLite3可加載形式(我從這里得到的線索:腳本將mysql dump sql文件轉換為可以導入sqlite3的格式D b )。我尚未研究MySQL轉儲的結構,數據是從第三方獲得的。我可以看到它具有創建表并插入到語句中的功能,但是鑒于其大小,很難手動閱讀并理解其結構。
由于大小原因,無法通過管道傳輸文件。還有一個bash腳本,用于加載文件,然后逐行處理,例如
while read line
抱怨說它的內存不足。
因此,我嘗試使用awk或sed來選擇每一行(兩者均起作用),將該行寫入文件,然后將其通過perl腳本列表。這是我正在使用的awk腳本
$ awk -vvar="$x" 'NR==var{print;exit}' file > temp
其中x保留行號,然后通過perl命令發送temp,最后將它們附加到輸出文件中。
但是,盡管最初速度很快,但是由于開始必須遍歷越來越多的行,因此它很快會變慢。大約有40,000行。
有沒有人像這樣工作?有更快的方法嗎?
為什么腳本必須遍歷越來越多的行?我猜您沒有40000個文件,每個文件僅包含一行,但是您能否提供更多詳細信息?
命令$ sed -n 10 {p; q} file,將讀取前9個,并給我第10行并退出sed。隨著數量增加到40,000,它必須遍歷更多行才能給我特定的行。
好的,我知道了。是否可以選擇先將文件分割成50個1Gb文件?然后對每個塊進行處理,最后再次加入這些塊。
我在超級計算機上可以擁有的文件數量受到限制,因此盡管50個文件太多,我還是可以嘗試獲得一個最大數量的文件,該數量將好于1個。謝謝您的指導。
也許您也可以發布正在使用的腳本? (如果很大,您可以嘗試將其上傳到pastebin.com并在此處提供鏈接)。
如果您給出了所需的MySQL導出數據和SQLite3可加載格式的示例,那么這似乎是一個更多人可以幫助的問題。我假設您希望從輸入中讀取的每一行MySQL都輸出一行SQLite數據?您鏈接到的解決方案對我來說似乎很可怕,而且我相信它可以用單個Perl程序編寫。
您正在MySQL中執行SELECT * FROM table INTO OUTFILE table.txt,然后在SQLite中執行.import table.txt table?
我還沒有編寫MySQL轉儲,也沒有完全按照文件的大小來遵循結構。該問題已更新以反映這一點。此外,盡管sqlite3仍然抱怨格式,但建議將文件拆分為腳本有效。謝謝!
一次只需處理一行:
while read -r line
do
echo"$line"> temp
…process temp with Perl, etc…
done < file
至少這不會表現出二次讀取文件的行為,這就是您的awk腳本所做的。
它只讀取一次大文件,這是Big-O表示法的最佳性能(在恒定因子內)。
如您所說,如果這導致bash出現問題,則應使用Perl讀取每一行。 在50 GiB數據中有40,000行,您大約有1個? 每行數據的MiB。 盡管可能會導致Bash問題,但這不太可能導致Perl出現任何問題。 您可以修改現有的Perl一次讀取一行,也可以使用簡單的包裝Perl腳本來完成上述Bash腳本的工作。
wrapper.pl
假設您當前的處理腳本稱為script.pl:
#!/usr/bin/env perl
use strict;
use warnings;
my $file ="temp";
while (<>)
{
open my $fh,">", $file or die;
print $fh $_;
close $fh;
system"perl","script.pl", $file;
}
未經測試的代碼
調用:
perl wrapper.pl output
總結
以上是生活随笔為你收集整理的mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python队列怎么用_如何在Pytho
- 下一篇: python中扑克牌类设计_Python